Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.05.2009, 18:04   #1
DeFt
 
Регистрация: 16.02.2009
Сообщений: 5
По умолчанию Вопрос по коду(Pascal)

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

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

Воспользовавшись поиском форума, нашел тему
http://programmersforum.ru/showthrea...EA%EE%E1%EE%EA
С исходником от Min'a :
Код:
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.
Подходит ли этот исходник под мою задачу? А если подходит, то пожалуйста поясните принцип ее действия, т.к. мои знания оч. небольшие... (Что за процедуры pos и length?).

У меня есть др. код, но его надо чуток дописать...Хочу взять этот
DeFt вне форума Ответить с цитированием
Старый 31.05.2009, 18:10   #2
__STDC__
Участник клуба
 
Аватар для __STDC__
 
Регистрация: 16.03.2009
Сообщений: 1,013
По умолчанию

Да, подходит.. программа удаляет все последовательности (), [] или {} встреченные в тексте.. если строка неверна (например та, что вы указали), то в строке останутся символы.. если введена правильная строка - она будет полностью удалена.. процедура pos возвращает позицию подстроки в строке (если таковая имеется), length - возвращает длину строки..
Если например взять ваши строки.. рассмотрим по итерациям цикла
(([()])()) :

1. (([])())
2. (()())
3. (())
4. ()
5. пустая строка

с другой стороны
(([)])() :

1. (([)])

и все.. дальше нечего удалять..
Uguu~

Последний раз редактировалось __STDC__; 31.05.2009 в 18:15.
__STDC__ вне форума Ответить с цитированием
Старый 31.05.2009, 18:15   #3
Alex2009
Proger Man
Форумчанин
 
Аватар для Alex2009
 
Регистрация: 07.03.2009
Сообщений: 584
По умолчанию

ДА ПРИМЕР ПРАВЕЛЬНЫЙ У МЕНЯ ЕСТЬ ДРУГОЙ ИСХОДНИК ТАМ ЛОГИКА ЛУТШЕ Я СЕГОДНЯ С РАБОТЫ ПРИЙДУ И ВЫЛОЖУ ЕСЛИ ХОЧИШ
ShowMessage('Добро пожаловать!');
Alex2009 вне форума Ответить с цитированием
Старый 31.05.2009, 18:16   #4
__STDC__
Участник клуба
 
Аватар для __STDC__
 
Регистрация: 16.03.2009
Сообщений: 1,013
По умолчанию

хм... тут никаких ошибок в логике нету... единственное, можно было бы оформить куски с if как процедуру.. а-то три раза один код переписан..
Uguu~
__STDC__ вне форума Ответить с цитированием
Старый 31.05.2009, 20:11   #5
DeFt
 
Регистрация: 16.02.2009
Сообщений: 5
По умолчанию

Цитата:
Сообщение от __STDC__ Посмотреть сообщение
хм... тут никаких ошибок в логике нету... единственное, можно было бы оформить куски с if как процедуру.. а-то три раза один код переписан..
Дооформил. Спасибо за объяснение!

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

Последний раз редактировалось KORN; 02.06.2009 в 05:55. Причина: пользуемся правкой
DeFt вне форума Ответить с цитированием
Старый 03.06.2009, 02:04   #6
DeFt
 
Регистрация: 16.02.2009
Сообщений: 5
По умолчанию

Цитата:
Сообщение от DeFt Посмотреть сообщение
Если есть "пересечение", то при выводе строки на экран надо выделить цветом те скобки, из-за которых произошло "пересечение". Как реализовать?
Не получится? Придется переписывать код по-другому? Или тут можно что-нибудь придумать..?
DeFt вне форума Ответить с цитированием
Старый 09.06.2009, 21:20   #7
DeFt
 
Регистрация: 16.02.2009
Сообщений: 5
По умолчанию

Вот еще код :
Код:
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.
Может кто-нибудь помочь дописать\исправить, а то я еще не разобрался, а надо, чтобы работала...
DeFt вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопрос по Pascal. NitriNKa Помощь студентам 5 03.05.2009 20:50
вопрос по МАССИВАМ СИМВОЛОВ(Pascal) -ushёl- Помощь студентам 6 15.03.2009 23:37
Вопрос по PASCAL xxasb07 Паскаль, Turbo Pascal, PascalABC.NET 2 19.11.2008 12:21
У меня вопрос такой(Pascal) Дима82 Помощь студентам 5 26.05.2008 22:02
Комментарии к коду Ярослав Помощь студентам 4 23.11.2007 16:57