Дана строка символов содержащая текст и арифметические выражения вида a®b, где ®-один из...

0 голосов
152 просмотров

Дана строка символов содержащая текст и арифметические выражения вида a®b, где ®-один из знаков +,-,*,/. Выписать все арифметические выражения и вычислить их значения


Информатика (103 баллов) | 152 просмотров
Дано ответов: 2
0 голосов
Правильный ответ
// PascalABC.NET 3.2, сборка 1417 от 28.03.2017
// Внимание! Если программа не работает, обновите версию!

begin
  var s:=ReadlnString('Вводите:');
  var m:=s.Matches('(\-{0,1}\d+(\.\d+){0,1}[\+\-\*\\]\d+(\.\d+){0,1})');
  foreach var e in m do begin
      var t:=e.Value;
      Write(t,'=');
      var op:=t.MatchValue('[\+\-\*\\]');
      var i:=Pos(op,t);
      var a:=t[:i].ToReal;
      var b:=t[i+1:].ToReal;
      case op[1] of
      '+':Writeln(a+b);
      '-':Writeln(a-b);
      '*':Writeln(a*b);
      '/':Writeln(a/b)
      end
    end
end.

Пример
Вводите: jhdkjfsgbj sf5+4sdfgs   fd39.8*178.78dghfg
5+4=9
39.8*178.78=7115.444

(150k баллов)
0 голосов

Программа работает при условии, что a и b не в скобках, и вещественные числа написаны с точкой, а не с запятой.

Код PascalABC.NET 3.2, сборка 1407 (19.03.2017):
Var
   S,S1,S2:string;
   a,b:real;
   i,j:integer;
Begin
Write('Введите текст: ');
ReadLn(S);
S:=' '+S+' ';
For i:= 2 to Length(S)-1 do
    Begin
    S1:='';
    S2:='';
    if (S[i] = '+')or(S[i] = '-')or(S[i] = '*')or(S[i] = '/') then
       if (S[i-1]in['0'..'9'])and(S[i+1]in['0'..'9']) then
          Begin
          For j:= i-1 downto 2 do
              Case S[j] of
              '0'..'9','.':S1:=S[j]+S1;
              '+','-':
                      Begin
                      S1:=S1+S[j];
                      Break;
                      End;
              else Break;
              End;
          For j:= i+1 to Length(S)-1 do
              Case S[j] of
              '0'..'9','.':S2:=S2+S[j];
              '+','-':
                      Begin
                      S2:=S2+S[j];
                      Break;
                      End;
              else Break;
              End;
          a:=StrToFloat(S1);
          b:=StrToFloat(S2);
          S1:=S1+S[i];
          if S2[1] = '-' then S2:='('+S2+')';
          S1:=S1+S2;
          Case S[i] of
          '+':WriteLn(S1+'=',a+b);
          '-':WriteLn(S1+'=',a-b);
          '*':WriteLn(S1+'=',a*b);
          '/':WriteLn(S1+'=',a/b);
          End;
          End;
    End;
End.

Пример:
Введите текст: jhdkjfsgbjsf 2+4sdfgsfd 39.8*178.78dghfg
2+4=6
39.8*178.78=7115.444

(34.0k баллов)
0

Вместо "S1:=S1+S[j];" надо было "S1:=S[j]+S1;" написать в 21 строке))