String70. Дана строка, содержащая латинские буквы и скобки трех видов: «()», «[]», «{}». Если скобки расставлены правильно (то есть каждой открывающей соответствует закрывающая скобка того же вида), то вывести число $$0$$. В противном случае вывести или номер позиции, в которой расположена первая ошибочная скобка, или, если закрывающих скобок не хватает, число $$-1$$.
Решение:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
program String70; var S:String; i,Num1,Num2,Num3,error:integer; begin Write('S: '); Readln(S); i:=1; error:=0; Num1:=0; Num2:=0; Num3:=0; while (i<=Length(S)) do begin if S[i]='(' then Num1:=Num1+1; if S[i]=')' then Num1:=Num1-1; if S[i]='[' then Num2:=Num2+1; if S[i]=']' then Num2:=Num2-1; if S[i]='{' then Num3:=Num3+1; if S[i]='}' then Num3:=Num3-1; if ((Num1<0) or (Num2<0) or (Num3<0)) and (error=0) then error:=i; inc(i); end; if error<>0 then Writeln(error) else if ((Num1>0) or (Num2>0) or (Num3>0)) then Writeln(-1) else Writeln(0); end. |
Другие задачи из раздела String можно посмотреть здесь.
Прога не работает так как надо.
И зачем нужна строка C, если она нигде не используется?
Переменная действительно лишняя, поправил.
Было:
Стало:
А какие симптомы, что она не работает?
суть в том , когда тебе вводят например ((([[]))]) программа должна выдавать не 0, потому что скобки пересекаются, в одной скобке открывается другая, а в третьей закрывается, должна вывестись ошибка по идее