Advertisement
Yarodash

Untitled

Dec 15th, 2020
1,206
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 4.16 KB | None | 0 0
  1. function replace(origin:string;  left, right:longint; str:string):string;
  2. begin
  3.   var new_line := '';
  4.  
  5.   for var i := 1 to left-1 do
  6.     new_line += origin[i];
  7.  
  8.   new_line += str;
  9.  
  10.   for var i := right+1 to length(origin) do
  11.     new_line += origin[i];
  12.  
  13.   replace := new_line;
  14. end;
  15.  
  16. function part(origin:string; left, right:longint):string;
  17. begin
  18.   var new_line := '';
  19.   for var i := left to right do
  20.     new_line += origin[i];
  21.   part := new_line;
  22. end;
  23.  
  24. function find_pair_to_bracket(s:string; p:longint):longint;
  25. begin
  26.   var q := 1;
  27.   for var i := p+1 to length(s) do begin
  28.     if s[i] = '(' then q := q + 1;
  29.     if s[i] = ')' then q := q - 1;
  30.     if q = 0 then begin find_pair_to_bracket := i; exit; end;
  31.   end;
  32.  
  33.   find_pair_to_bracket := -1;
  34. end;
  35.  
  36. function calculate_function(func_name:string; arg:string):string;
  37. begin
  38.   var _result := 0.0;
  39.   var _arg := StrToFloat(arg);
  40.   case func_name of
  41.     'sin': _result := sin(_arg);
  42.     'cos': _result := cos(_arg);
  43.   end;
  44.  
  45.   calculate_function := FloatToStr(_result);
  46. end;
  47.  
  48. function find_left_number(s:string; p:longint):longint;
  49. begin
  50.   var q := 0;
  51.   for var i := p downto 1 do
  52.     if not ((s[i] in ['0'..'9']) or (s[i] = '.')) then begin
  53.       q := i;
  54.       break;
  55.     end;
  56.    
  57.   find_left_number := q+1;
  58. end;
  59.  
  60. function find_right_number(s:string; p:longint):longint;
  61. begin
  62.   var q := length(s)+1;
  63.   for var i := p to length(s) do begin
  64.     if not ((s[i] in ['0'..'9']) or (s[i] = '.')) then begin
  65.       q := i;
  66.       break;
  67.     end;
  68.   end;
  69.    
  70.   find_right_number := q-1;
  71. end;
  72.  
  73. function calculate_operation(_left, _right:string; operation:char):string;
  74. begin
  75.   var _result := 0.0;
  76.   var left := StrToFloat(_left);
  77.   var right := StrToFloat(_right);
  78.  
  79.   case operation of
  80.     '^': _result := power(left, right);
  81.     '*': _result := left*right;
  82.     '/': _result := left/right;
  83.     '+': _result := left+right;
  84.     '-': _result := left-right;
  85.   end;
  86.  
  87.   calculate_operation := FloatToStr(_result);
  88. end;
  89.  
  90. function calculate(s:string):string;
  91. begin
  92.   for var i := 1 to length(s)-1 do begin
  93.     if (s[i] = '+') and (s[i+1] = '-') then s := replace(s, i, i+1, '-');
  94.     if (s[i] = '+') and (s[i+1] = '+') then s := replace(s, i, i+1, '+');
  95.     if (s[i] = '-') and (s[i+1] = '-') then s := replace(s, i, i+1, '+');
  96.     if (s[i] = '-') and (s[i+1] = '+') then s := replace(s, i, i+1, '-');
  97.   end;
  98.  
  99.   writeln(s);
  100.  
  101.   var func_name := '';
  102.   var start_of_func := 0;
  103.   for var i := 1 to length(s) do begin
  104.     if s[i] in ['a'..'z'] then begin
  105.       if func_name = '' then start_of_func := i;
  106.       func_name += s[i];
  107.     end;
  108.     if not (s[i] in ['a'..'z']) and (func_name <> '') then
  109.     begin
  110.       var a := part(s, i+1, find_pair_to_bracket(s, i)-1);
  111.       var replacing := calculate_function(func_name, calculate(a));
  112.      
  113.       calculate := calculate(replace(s, start_of_func, find_pair_to_bracket(s, i+1), replacing));
  114.       exit;
  115.     end;
  116.   end;
  117.      
  118.   for var i := 1 to length(s) do begin
  119.     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;
  120.   end;
  121.      
  122.   for var i := 1 to length(s) do
  123.     if (s[i] = '^') then
  124.       begin
  125.         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])));
  126.         exit;
  127.       end;
  128.      
  129.   for var i := 1 to length(s) do
  130.     if (s[i] = '*') or (s[i] = '/') then
  131.       begin
  132.         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])));
  133.         exit;
  134.       end;
  135.      
  136.   for var i := 1 to length(s) do
  137.     if (s[i] = '+') or (s[i] = '-') then
  138.       begin
  139.         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])));
  140.         exit;
  141.       end;
  142.  
  143.   calculate := s;
  144. end;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement