OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 28 Март, 2024 19:46

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 4 ] 
Автор Сообщение
 Заголовок сообщения: Задачка на проверку "скобок"
СообщениеДобавлено: Вторник, 04 Май, 2010 08:43 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Знакомый попросил помочь с задачей:

Цитата:
Используя представление стека с помощью массива, напишите на языке паскаль программу которая считывает символьную строку, содержащую три набора скобок (<<(<< и >>)>>),   (<< < << и >> > >>),   (<<[<< и >>]>>) и проверить правильно ли расставлены в этой строке скобки.


Решение на Турбо Паскале:

Код:
PROGRAM Kur0510;

   CONST
      (* Kody tokenov dlja otkryvajuschih skobok *)
      bracket1 = 1; (* (<<(<< *)
      bracket2 = 2; (* (<< < << *)
      bracket3 = 3; (* (<<[<< *)
         (* Dlya zakryvajuschih beretsya so znakom - *)
      other = 4;
      eof = 0;

      br1open = '(<<(<<';
      br1close = '>>)>>)';
      br2open = '(<< < <<';
      br2close = '>> > >>)';
      br3open = '(<<[<<';
      br3close = '>>]>>)';

   TYPE
      Token = INTEGER;

   VAR
      input: STRING;
      ipos: INTEGER;

      curToken: Token;

      stack: ARRAY [0..1024] OF Token;
      spos: INTEGER;

   PROCEDURE ScanToken; FORWARD;

   FUNCTION ProcessInput: BOOLEAN;
      VAR ok: BOOLEAN;
   BEGIN
      ok := TRUE;
      spos := 0;
      ScanToken;
      WHILE (curToken <> eof) AND ok DO BEGIN
         CASE curToken OF
         bracket1, bracket2, bracket3:
            BEGIN
               stack[spos] := curToken;
               INC(spos)
            END;
         -bracket1, -bracket2, -bracket3:
            BEGIN
               IF (spos > 0) AND (stack[spos-1] = -curToken) THEN BEGIN
                  DEC(spos)
               END
               ELSE BEGIN
                  ok := FALSE
               END
            END
         END;
         ScanToken
      END;
      ok := ok AND (spos = 0);
      ProcessInput := ok
   END (* ProcessInput *);

   PROCEDURE CheckBracket (VAR isBracket: BOOLEAN; VAR brToken: Token;
      VAR len: INTEGER); FORWARD;

   PROCEDURE ScanToken;
      VAR isBracket: BOOLEAN;
            brToken: Token;
            brLen: INTEGER;
   BEGIN
      IF ipos <= LENGTH(input) THEN BEGIN
         CheckBracket(isBracket, brToken, brLen);
         IF isBracket THEN BEGIN
            curToken := brToken;
            INC(ipos, brLen)
         END
         ELSE BEGIN
            curToken := other;
            INC(ipos)
         END
      END
      ELSE BEGIN
         curToken := eof
      END
   END (* ScanToken *);

   FUNCTION Look (lexem: STRING): BOOLEAN;
      VAR i, j: INTEGER;
   BEGIN
      IF ipos + LENGTH(lexem)-1 <= LENGTH(input) THEN BEGIN
         i := ipos; j := 1;
         WHILE (j <= LENGTH(lexem)) AND (input[i] = lexem[j])
         DO BEGIN
            INC(i); INC(j)
         END;
         Look := j = LENGTH(lexem) + 1   (* To est, vse simvoly sovpali *)
      END
      ELSE BEGIN
         Look := FALSE
      END
   END (* Look *);

   PROCEDURE CheckBracket (VAR isBracket: BOOLEAN; VAR brToken: Token;
      VAR len: INTEGER);
   BEGIN
      IF Look(br1open) THEN BEGIN
         isBracket := TRUE;
         brToken := bracket1;
         len := LENGTH(br1open)
      END
      ELSE IF Look(br1close) THEN BEGIN
         isBracket := TRUE;
         brToken := -bracket1;
         len := LENGTH(br1close)
      END
      ELSE IF Look(br2open) THEN BEGIN
         isBracket := TRUE;
         brToken := bracket2;
         len := LENGTH(br2open)
      END
      ELSE IF Look(br2close) THEN BEGIN
         isBracket := TRUE;
         brToken := -bracket2;
         len := LENGTH(br2close)
      END
      ELSE IF Look(br3open) THEN BEGIN
         isBracket := TRUE;
         brToken := bracket3;
         len := LENGTH(br3open)
      END
      ELSE IF Look(br3close) THEN BEGIN
         isBracket := TRUE;
         brToken := -bracket3;
         len := LENGTH(br3close)
      END
      ELSE BEGIN
         isBracket := FALSE
      END
   END (* CheckBracket *);

BEGIN
   Write('Input string: ');
   ReadLn(input);
   ipos := 1;
   IF ProcessInput THEN BEGIN
      WriteLn('ok')
   END
   ELSE BEGIN
      WriteLn('Error!')
   END;
   WriteLn('Press Enter...');
   ReadLn
END.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Задачка на проверку "скобок"
СообщениеДобавлено: Вторник, 04 Май, 2010 09:03 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Илья Ермаков писал(а):
Решение на Турбо Паскале:
И?...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Задачка на проверку "скобок"
СообщениеДобавлено: Вторник, 04 Май, 2010 09:53 

Зарегистрирован: Воскресенье, 28 Май, 2006 22:12
Сообщения: 1693
Info21 писал(а):
Илья Ермаков писал(а):
Решение на Турбо Паскале:
И?...

вероятно - демонстрация способностей... :)
типа: ... and now we present proudly...
а - чо? - любому программисту присуще... ;)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Задачка на проверку "скобок"
СообщениеДобавлено: Вторник, 04 Май, 2010 11:40 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
В фонд примеров по теме подфорума :)

Не пропадать же, коли пришлось написать...


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 4 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB