Информатика,программирование

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

Информатика,программирование


image

Информатика (22 баллов) | 39 просмотров
0

Провокационная постановка задачи. Чтобы убедиться, что скобки проставлены верно, нужно разобрать выражение в скобках на элементы и установить, являются ли все эти элементы допустимыми в данном выражении. Например, в выражении 2(.3(52)*4.(7-1.)8) скобки формально проставлены верно (у каждой левой скобки есть парная правая), но само выражение синтаксически неверно.

0

И, конечно же, Вы забыли указать язык программирования, не говоря о его версии.

0

Или Вас интересует формальное решение, лишь бы скобки были парными с правильной вложенностью, а что в них - несущественно?

0

Ну как угодно... молчание - тоже ответ.

Дан 1 ответ
0 голосов
Правильный ответ

// PascalABC.NET 3.1, сборка 1256 от 21.06.2016
begin
  var n:=ReadlnInteger('Число строк:');
  Writeln('Вводите выражения построчно');
  var a:=ReadArrString(n);
  var ibr:array[1..4] of integer;
  Writeln('Результаты работы программы');
  for var j:=0 to a.Length-1 do begin
    var s:=a[j];
    var lvl:=0;
    var s1:string;
    repeat
      s1:=s.MatchValue('(\(.*\))');
      if s1.Length>0 then begin
        Inc(lvl);
        var i:=Pos(s1,s);
        if lvl>1 then begin ibr[3]:=ibr[1]; ibr[4]:=ibr[2] end;
        ibr[1]:=i; ibr[2]:=i+s1.Length-1;
        s[ibr[1]]:='{'; s[ibr[2]]:='}';
        end
    until s1.Length=0;
    if lvl>0 then begin s[ibr[1]]:='('; s[ibr[2]]:=')' end;
    if lvl>1 then begin s[ibr[3]]:='['; s[ibr[4]]:=']' end;
    a[j]:=s;
    Writeln(a[j])
    end
end.

Тестовое решение
Число строк: 5
Вводите выражения построчно
ln(sin((a+b)c-d))
2+(2+(2+(3+(4+7)+1)+9)+2)*3
2+(2-3)/4
(1+(2-3)/5)*4
неверная 1+(2*2)-5)
Результаты работы программы
ln{sin[(a+b)c-d]}
2+{2+{2+[3+(4+7)+1]+9}+2}*3
2+(2-3)/4
[1+(2-3)/5]*4
неверная 1+(2*2)-5)

(142k баллов)