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

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

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

Автор: XimeR 3.06.2009 17:01

Собственно задача :

Дана последовательность круглых фигурных и квадратных скобок. Определить, нет ли "пересечения" скобок. Например, последовательность (([)])() НЕправильна, а последовательность (([()])()) - правильна.
Нашел исходник:

Код

var s:string;    
    c:byte;    
    b:boolean;    
begin    
     readln(s);    
     b:=true;    
     while b do    
      begin    
       b:=false;    
       c:=pos('[]',s);    
       if c>0 then    
        begin    
         delete(s,c,2);    
         b:=true;    
        end;    
       c:=pos('()',s);    
       if c>0 then    
        begin    
         delete(s,c,2);    
         b:=true;    
        end;    
       c:=pos('{}',s);    
       if c>0 then    
        begin    
         delete(s,c,2);    
         b:=true;    
        end;    
      end;    
    if length(s)>0 then writeln('No')    
    else writeln('Yes');    
end.


Возникла еще одна сложность.
Если есть "пересечение", то при выводе строки на экран надо выделить цветом те скобки, из-за которых произошло "пересечение". Как реализовать?(с моими небольшими знаниями...)
Или тут придется по-другому писать? Может исходник со стеком видел кто...

Автор: Гость 3.06.2009 17:21

Цитата(XimeR @ 3.06.2009 13:01) *

при выводе строки на экран надо выделить цветом те скобки, из-за которых произошло "пересечение".
Не совсем ясно. Вот в этом примере выдели, пожалуйста, красным, то, что нужно:

( [ ( ] )

Автор: Гость 3.06.2009 17:25

А также вот в этом:

( ( ( ( ( ( (

И вот в этом:

) ) ) ( ( (

Автор: amega 3.06.2009 20:48

вся задача со скобками сводится к стеку.. написать поцедуру пуш и поп и потом прото проверять последний елемент.

Автор: XimeR 4.06.2009 0:52

Цитата(amega @ 3.06.2009 17:48) *

вся задача со скобками сводится к стеку.. написать поцедуру пуш и поп и потом прото проверять последний елемент.

Видел такие советы в инете, но блин в стеках и прочем я не силен, т.к. еще это не изучил...=(
А исходник только один нашел, который выложил...

А в этом коде не корректные скобки никак не подстветить при выводе?

Автор: volvo 4.06.2009 0:56

Цитата
но блин в стеках и прочем я не силен, т.к. еще это не изучил...=(
В таком случае уточни, что ты уже изучил. Это первое.

А второе - тебе задали вопрос, что выделять в трех приведенных случаях. Ты его оставил без ответа. Почему?

Автор: XimeR 7.06.2009 18:17

Цитата(volvo @ 3.06.2009 21:56) *

В таком случае уточни, что ты уже изучил. Это первое.

А второе - тебе задали вопрос, что выделять в трех приведенных случаях. Ты его оставил без ответа. Почему?


Изучил мало...Вообще ничего....Все только ур-нь школы - массивы, процедуры и ф-ии...

Цитата
А второе - тебе задали вопрос, что выделять в трех приведенных случаях. Ты его оставил без ответа. Почему?

Ну я вообще-то не понял, к чему эти скобки...У меня ведь в примере ищет и удаляет пару скобок, которая содержит и открытую, и закрытую...Находит - удаляет....Если в строке ничего, то правильно, если осталось что-то, то то и выделить нужно...

Автор: volvo 7.06.2009 19:11

Цитата
У меня ведь в примере ищет и удаляет пару скобок, которая содержит и открытую, и закрытую...Находит - удаляет...
Это проблемы твоей реализации... По заданию ты ничего не должен удалять, там сказано:
Цитата
Определить, нет ли "пересечения" скобок.
, и все, ни о каких удалениях речь не идет...

Автор: XimeR 7.06.2009 20:44

Цитата(volvo @ 7.06.2009 16:11) *

Это проблемы твоей реализации... По заданию ты ничего не должен удалять, там сказано: , и все, ни о каких удалениях речь не идет...


smile.gif Тогда как решать задачу?

Автор: Lapp 8.06.2009 9:30

Цитата(XimeR @ 7.06.2009 17:44) *
Тогда как решать задачу?
Очень просто - нажимай на клавиши в нужной последовательности smile.gif.

Цитата(XimeR @ 7.06.2009 15:17) *
Если в строке ничего, то правильно, если осталось что-то, то то и выделить нужно...
Вот и выдели, в тех примерах, которые я привел (гостем). В форме ответа есть кнопочка для цвета текста, воспользуйся ей, пожалуйста.

Если условие неясно - как решать задачу? blink.gif


Автор: XimeR 8.06.2009 20:22

Цитата(Lapp @ 8.06.2009 6:30) *

Вот и выдели, в тех примерах, которые я привел (гостем). В форме ответа есть кнопочка для цвета текста, воспользуйся ей, пожалуйста.

blink.gif Тогда не пойму вообще....Если по примеру смотреть, то я думал в последовательности выделяем ( [ ( ] ) (из-за них произошло пересечение)
И ( ( ( ( ( ( (
И ) ) ) ( ( (.... ( неправильные последовательности)
А выходит я не прав? nea.gif

Автор: Lapp 9.06.2009 3:17

Цитата(XimeR @ 8.06.2009 17:22) *
А выходит я не прав?
Откуда нам знать, прав ли ты. Из тебя не так просто вытягивать информацию. Ты никак не хочешь понять, что задача не до конца поставлена. И кто будет тогда ее решать?
Если стену надо покрасить в красный - нет проблем. Если в полосочку с цветочками - тоже. А если говорят: "покрась, неизвестно как, но не ошибись!" - то извини..
Вот этот пример мне так и неясен:
( [ ) ]
Кто кому мешает? Если отбрезать:
( [ )
- то вроде ясно, что [ лишняя, ее надо выделять. Так? Но тогда совсем неявсно, что выделять в первом примере.

Автор: XimeR 9.06.2009 23:37

Цитата(Lapp @ 9.06.2009 0:17) *

Вот этот пример мне так и неясен:
( [ ) ]
Кто кому мешает? Если отбрезать:
( [ )
- то вроде ясно, что [ лишняя, ее надо выделять. Так? Но тогда совсем неявсно, что выделять в первом примере.

Тогда я сам в тупике...Я думал, что надо выделить скобки, в которых "произошло пересечение"...
Пример неправильной последовательности :
(([)])() ===> (([)])
Или 2 пары скобок (([)])
Что правильней сам не пойму wacko.gif

___________________________________________
Вот еще наработка...Но в коде я не разбирался и врядли разберусь быстро.
Код

type
  s=str[80];
  yk=^el;
  el=record
   inf:byte;
   adr:yk;
     end;
var  
  str:s;
  p:integer;
  na:yk;
const
  otkr:s=['(','[','{'];
  zakr:s=[')',']','}'];
function poisk(str[k]:char):integer;
procedure vkl(nom:byte);
...
begin
  writeln('vvedite stroku');
  readln(str);
  k:=1;
  while k<=streln(str) do
       begin
         p:=poisk(str[k]);
         if p<>0 then
                     if p>0 then vkl(p)
                     else
                         begin
                           os=izwl;
                           if os=o then writeln (...);
                           if os<>-p then writeln ('ne ta otkr.skobka');
                         end;
       inc(k);
       end;
  if izwl <>0 then writeln ('lishnie skobki');
end.


Может кто-нибудь помочь дописать\исправить, а то я еще не разобрался, а надо, чтобы работала...

Автор: Archon 10.06.2009 14:11

Если смотреть по логике работы стека, то выделять надо так:
( [ ( ] )
( [ ) ]
( ( ( ( ( ( (
) ) ) ( ( (

То есть если скобка не подходит, то выделяем ее цветом и пропускаем. Примерно так:


. . .
for i := 1 to Length(Str) do begin
case Str[i] of
'(', '[': Stack.Push(Str[i]);
')': if Stack.Pop <> '(' then TextColor(Red);
']': if Stack.Pop <> '[' then TextColor(Red);
else begin
WriteLn;
WriteLn('Ошибка: посторонние символы в строке.');
Halt;
end;
end;
Write(Str[i]);
TextColor(LightGray);
end;
. . .


XimeR, попробуй привести задание дословно. Может и поймем что-то.

Автор: XimeR 10.06.2009 22:56

Цитата

XimeR, попробуй привести задание дословно. Может и поймем что-то.

Задание дословно в 1ом посту...Но когда я показывал исходник преподу, она и сказала: "Выдели, где пересечение" blink.gif
Archon твой код под мой исходник?! wacko.gif Куда его вставить? unsure.gif

Автор: Lapp 11.06.2009 8:08

Цитата(XimeR @ 10.06.2009 19:56) *
Archon твой код под мой исходник?! wacko.gif Куда его вставить?
Господа офицеры, прошу молчать! (С) lol.gif
Его не надо никуда вставлять, он сам по себе. Но для него нужны процедуры, которые реализуют стэк. Посмотри на эту тему в FAQе.