Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ строки

Автор: Rom1k 23.05.2007 2:36

Строка символов представляет собой арифметическое выражение. Проверить правильность расстановки скобок в этом выражении. Скобки могут быть вложенными
пример работы программы:

Цитата
(3+5)-4(4+1

ответ:
Цитата
не хватает закрывающей скобки


Программа.Но она неправильная и не правильно работает.исправьте плиз!!!!

Program stroka;
uses crt;
var
st,st1:string;
i,l,r,k:integer;
begin
clrscr;
write(' Задайте строку содержащую скобки: ');
readln(st);
l:=0;
r:=0;
i:=1;
while i<=length(st) do
begin
while ((st[i]<>'(') or (st[i]<>')')) and (i<=length(st)) do
i:=i+1;
if st[i]='(' then
l:=l+1;
if st[i]=')' then
r:=r+1;
if i>=length(st) then
writeln(' В строке нет скобок')
else
writeln(' Левых скобок: ',l);
writeln(' Правых скобок: ',r);
end;
repeat until keypressed
end.


Автор: volvo 23.05.2007 2:41

опять велосипеды? Даже соревнование проводилось на эту тему, есть ОЧЕНЬ много реализаций...

Автор: Rom1k 23.05.2007 2:45

я в поиске вбивал,не нашёл...

Автор: Sto 23.05.2007 2:58

Поробуй так

Uses
Crt;
Var
st : String;
ch : Char;
i, Left, Right : Integer;
Begin
ClrScr;
Write('Enter string -> ');
ReadLn(st);
For i := 1 To Length(st) Do
Begin
ch := st[i];
If ch = '(' Then Left := Left + 1;
If ch = ')' Then Right := Right + 1;
End;
WriteLn('Left : ',Left);
WriteLn('Right : ',Right);
If Left > Right Then WriteLn('Left > Right, on ',Left - Right);
If Left < Right Then WriteLn('Left < Right, on ',Right - Left);
If Left = Right Then WriteLn('OK');
ReadKey;
End.

Будут вопросы пиши.

Автор: volvo 23.05.2007 3:03

http://forum.pascal.net.ru/index.php?s=&showtopic=2868&view=findpost&p=25304

Автор: Rom1k 23.05.2007 3:07

спасибо большое.ща разберусь.всё правильно работает!

Автор: volvo 23.05.2007 3:10

Sto, пример некорректной работы кода:
Введи )(4+5)(

Автор: Sto 23.05.2007 3:14

Цитата(volvo @ 22.05.2007 23:10) *

Sto, пример некорректной работы кода:
Введи )(4+5)(

Точно, есть погрешность yes2.gif
Буду думать как поправить.

Автор: Sto 26.05.2007 2:01

Исправил ошибку

Uses
Crt;
Var
st, Ans : String;
i, Left, Right, sw : Integer;
Begin
ClrScr;
Write('Enter string -> ');
ReadLn(st);
Ans := 'Ok';
For i := 1 To Length(st) Do
Begin
If st[i] = '(' Then Begin Left := Left + 1; sw := sw + 1 End;
If st[i] = ')' Then Begin Right := Right + 1; sw := sw - 1 End;
If sw < 0 Then Ans := 'Error';
End;
WriteLn('Left : ',Left);
WriteLn('Right : ',Right);
If Left > Right Then WriteLn('Left > Right, on ',Left - Right);
If Left < Right Then WriteLn('Left < Right, on ',Right - Left);
If Left = Right Then WriteLn(Ans);
ReadKey;
End.