Есть простой подсчета парности скобок. Инициализируем счетчик нулем, а затем читаем строку. Если встречается открывающая скобка, в счетчик посылается +1, если закрывающая, то -1. После просмотра всей строки нулевое значение счетчика скажет нам о равенстве скобок, а ненулевое покажет количество лишних скобок. Каких именно - покажет знак. Попутно замечу, что подобные подсчеты не гарантирует проверки синтаксической правильности расстановки скобок, например, выражение )a+b( синтаксически неверно, но в нем "правильное" количество скобок.
var i,k:integer; s:string; begin Write('Введите строку: '); Readln(s); k:=0; for i:=1 to Length(s) do case s[i] of '(':Inc(k); ')':Dec(k) end; if k=0 then Writeln('Скобки парные') else begin Write('Обнаружено непарных '); if k>0 then Write('открывающих') else Write('закрывающих'); Writeln(' скобок: ',abs(k)) end end.
Перепишем программу в виде, удобном для анализа алгоритма. var a,b,t,N:integer; function F(x:integer):integer; begin F:=16*(6-x)*(6-x)-450; end; begin a:=-20; b:=20; N:=0; for t:=-20 to 20 do if (F(t)>=0) then N:=N+1; Write(N) end.
Переменные a и b получают начальные значения, но дальше не используются, поэтому их рассматривать не нужно. Все переменные в программе объявлены целочисленными, поэтому анализируем алгоритм также в целых числах. Переменная t последовательно принимает значения от -20 до 20, следовательно, можно записать, что t ∈ [-20;20] Для каждого t вычисляется значение некоторой функции F(t) и подсчитывается N - количество случаев, когда значение F(t) неотрицательно. Найденное N затем выводится. Ставится задача определить значение N. Проанализируем функцию F(t). После простого преобразования получаем F(t)=16(6-t)²-450 Теперь надо найти решение неравенства F(t)≥0.
Поскольку решение выполнятся в целых числах, то значение в правой части неравенства достаточно записать с точностью один знак после запятой.
На интервале [-20;20] первому условию удовлетворит 21 точка, второму условию удовлетворят 9 точек. Всего получится 21+9=30 точек. ответ: Будет выведено число 30
Попутно замечу, что подобные подсчеты не гарантирует проверки синтаксической правильности расстановки скобок, например, выражение )a+b( синтаксически неверно, но в нем "правильное" количество скобок.
var
i,k:integer;
s:string;
begin
Write('Введите строку: '); Readln(s);
k:=0;
for i:=1 to Length(s) do
case s[i] of
'(':Inc(k);
')':Dec(k)
end;
if k=0 then Writeln('Скобки парные')
else
begin
Write('Обнаружено непарных ');
if k>0 then Write('открывающих') else Write('закрывающих');
Writeln(' скобок: ',abs(k))
end
end.
Тестовое решение:
Введите строку: (3*k+1/(c-5)*a;
Обнаружено непарных открывающих скобок: 1
var
a,b,t,N:integer;
function F(x:integer):integer;
begin
F:=16*(6-x)*(6-x)-450;
end;
begin
a:=-20; b:=20;
N:=0;
for t:=-20 to 20 do
if (F(t)>=0) then N:=N+1;
Write(N)
end.
Переменные a и b получают начальные значения, но дальше не используются, поэтому их рассматривать не нужно.
Все переменные в программе объявлены целочисленными, поэтому анализируем алгоритм также в целых числах.
Переменная t последовательно принимает значения от -20 до 20, следовательно, можно записать, что t ∈ [-20;20]
Для каждого t вычисляется значение некоторой функции F(t) и подсчитывается N - количество случаев, когда значение F(t) неотрицательно. Найденное N затем выводится. Ставится задача определить значение N.
Проанализируем функцию F(t). После простого преобразования получаем
F(t)=16(6-t)²-450
Теперь надо найти решение неравенства F(t)≥0.
Поскольку решение выполнятся в целых числах, то значение в правой части неравенства достаточно записать с точностью один знак после запятой.
На интервале [-20;20] первому условию удовлетворит 21 точка, второму условию удовлетворят 9 точек. Всего получится 21+9=30 точек.
ответ: Будет выведено число 30