Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Pascal] Задача на последовательность скобок 
:(
    Опции темы
XimeR
Дата 3.6.2009, 01:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 3.6.2009

Репутация: нет
Всего: нет



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

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

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.


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

PM MAIL   Вверх
neic
Дата 3.6.2009, 06:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 839
Регистрация: 28.1.2007

Репутация: 5
Всего: 7



Насчёт выделения скобок используй TextColor 
PM MAIL WWW ICQ Skype   Вверх
zim22
Дата 3.6.2009, 07:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 16
Всего: 69



кидайте в стек левые скобки. и извлекайте из стека, когда встречается правая скобка. 
если извлечённой скобки отличается от типа закрывающей скобки  - значит ошибочный порядок скобок.


--------------------
PM MAIL   Вверх
XimeR
Дата 3.6.2009, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 3.6.2009

Репутация: нет
Всего: нет



Цитата
кидайте в стек левые скобки. и извлекайте из стека, когда встречается правая скобка. 
если извлечённой скобки отличается от типа закрывающей скобки  - значит ошибочный порядок скобок.

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

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

PM MAIL   Вверх
I_Am_Rock
Дата 3.6.2009, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 523
Регистрация: 18.1.2008

Репутация: 2
Всего: 15



Цитата(XimeR @  3.6.2009,  20:58 Найти цитируемый пост)
Видел такие советы в инете, но блин в стеках и прочем я не силен, т.к. еще это не изучил...=(

Принцип стека, насколько я знаю, такой.

Сначала так          1.# 2.# 3.# 4.# 5.# 6.#

потом, допустим, появилась квадратная скобка
стало так               1.[ 2.# 3.# 4.# 5.# 6.#

потом, допустим, круглая
стало так               1.( 2.[ 3.# 4.# 5.# 6.#
т.е. содержимое переместилось вправо

потом, допустим, квадратная
стало так               1.[ 2.( 3.[ 4.# 5.# 6.#
опять вправо, впуская новый элемент с левой стороны

а потом, допустим, закрывающая скобка. и если она совпадает с 1 (т.е. квадратная), то
становится так       1.( 2.[ 3.# 4.# 5.# 6.#
т.е. левый элемент убирается; процесс продолжается...

а если закрыв. скобка по своему типу не совпадает с крайним левым элементом, то значит ошибочка вышла.


Это сообщение отредактировал(а) I_Am_Rock - 3.6.2009, 22:29
PM MAIL WWW   Вверх
XimeR
Дата 9.6.2009, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 3.6.2009

Репутация: нет
Всего: нет



Вот еще код :
Код

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.


Может кто-нибудь помочь дописать\исправить, а то я еще не разобрался, а надо, чтобы работала...
PM MAIL   Вверх
XimeR
Дата 2.7.2009, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 3.6.2009

Репутация: нет
Всего: нет



Что, вообще никаких вариантов?

Добавлено позже
Что, вообще никаких вариантов?
PM MAIL   Вверх
taiven
Дата 3.7.2009, 02:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 302
Регистрация: 30.6.2008

Репутация: 4
Всего: 9



Код

program prog;

function IsCorrect(s : string; len : integer) : boolean;
var
   temp : string;
   i : integer;
begin
     if (len mod 2) <> 0 then
     begin
          IsCorrect := false;
          exit;
     end;

     temp := '';

     for i := 1 to len do
     begin
          if (s[i] = '(') or (s[i] = '[') then temp := temp + s[i]
          else
          begin
               if ((temp[Length(temp)] = '(') and (s[i] = ')')) or ((temp[Length(temp)] = '[') and (s[i] = ']')) then
                  Delete(temp, Length(temp), 1)
               else
               begin
                    IsCorrect := false;
                    exit;
               end;
          end;
     end;

     IsCorrect := true;
end;


var
   str : string;
begin
     //str := '(([)])()';
     str := '(([()])())';

     if IsCorrect(str, Length(str)) then WriteLn('Good')
     else WriteLn('Bad');


     WriteLn;
     ReadLn;
end.
                                                 
        
правда здесь не совсем стек получился smile но идея таже, что предложил zim22
PM   Вверх
XimeR
Дата 3.7.2009, 22:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 3.6.2009

Репутация: нет
Всего: нет



Цитата

Код

program prog;

function IsCorrect(s : string; len : integer) : boolean;
var
   temp : string;
   i : integer;
begin
     if (len mod 2) <> 0 then
     begin
          IsCorrect := false;
          exit;
     end;

     temp := '';

     for i := 1 to len do
     begin
          if (s[i] = '(') or (s[i] = '[') then temp := temp + s[i]
          else
          begin
               if ((temp[Length(temp)] = '(') and (s[i] = ')')) or ((temp[Length(temp)] = '[') and (s[i] = ']')) then
                  Delete(temp, Length(temp), 1)
               else
               begin
                    IsCorrect := false;
                    exit;
               end;
          end;
     end;

     IsCorrect := true;
end;


var
   str : string;
begin
     //str := '(([)])()';
     str := '(([()])())';

     if IsCorrect(str, Length(str)) then WriteLn('Good')
     else WriteLn('Bad');


     WriteLn;
     ReadLn;
end.
                                                 
        
правда здесь не совсем стек получился smile но идея таже, что предложил zim22


Что-то не пойму...Ввожу неправильную последовательность ([)] а пишет Good....Доделывать надо что-то?
PM MAIL   Вверх
taiven
Дата 3.7.2009, 23:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 302
Регистрация: 30.6.2008

Репутация: 4
Всего: 9



Цитата
Ввожу неправильную последовательность ([)] а пишет Good

Нет, не пишет  smile Понятия не имею почему у вас пишет Good. Попросите чтоб проверил кто-то ещё...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.1048 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.