OberonCore https://forum.oberoncore.ru/ |
|
Задачка на проверку "скобок" https://forum.oberoncore.ru/viewtopic.php?f=61&t=2621 |
Страница 1 из 1 |
Автор: | Илья Ермаков [ Вторник, 04 Май, 2010 08:43 ] |
Заголовок сообщения: | Задачка на проверку "скобок" |
Знакомый попросил помочь с задачей: Цитата: Используя представление стека с помощью массива, напишите на языке паскаль программу которая считывает символьную строку, содержащую три набора скобок (<<(<< и >>)>>), (<< < << и >> > >>), (<<[<< и >>]>>) и проверить правильно ли расставлены в этой строке скобки. Решение на Турбо Паскале: Код: 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. |
Автор: | Info21 [ Вторник, 04 Май, 2010 09:03 ] |
Заголовок сообщения: | Re: Задачка на проверку "скобок" |
Илья Ермаков писал(а): Решение на Турбо Паскале: И?...
|
Автор: | Wlad [ Вторник, 04 Май, 2010 09:53 ] |
Заголовок сообщения: | Re: Задачка на проверку "скобок" |
Info21 писал(а): Илья Ермаков писал(а): Решение на Турбо Паскале: И?...вероятно - демонстрация способностей... типа: ... and now we present proudly... а - чо? - любому программисту присуще... |
Автор: | Илья Ермаков [ Вторник, 04 Май, 2010 11:40 ] |
Заголовок сообщения: | Re: Задачка на проверку "скобок" |
В фонд примеров по теме подфорума Не пропадать же, коли пришлось написать... |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |