Форум программистов, компьютерный форум, киберфорум
Наши страницы
Pascal ABC
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
Ksenia_rth
0 / 0 / 0
Регистрация: 07.01.2016
Сообщений: 1
1

Строка: Проверка на корректную расстановку скобок

07.01.2016, 16:42. Просмотров 1209. Ответов 14
Метки нет (Все метки)

Дана строка, содержащая латинские буквы и скобки трех видов ( ), { }, [ ]. Если скобки расставлены правильно (то есть каждой открывающей соответствует закрывающая скобка того же вида), то вывести 0. В противном случае вывести или номер позиции, в которой расположена первая ошибочная скобка или, если закрывающих скобок не хватает, число -1.
Неправильно работает, например, при вводе {] выводит -1, а должна номер ошибочной скобки.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
program lab7;
uses crt;
var
S,P:string;
r:integer;
i:integer; 
begin
Write('Введите строку: ');
readln(S);
r:=0;    
P:='';
for i:=1 to length(S) do 
begin
 
if S[i]='(' then
P:=P+'('; 
if (S[i]=')')then
begin
if (P[length(P)]='(') then
delete(P,length(P),1) 
else
begin
r:=i;
break;
end;
end;
 
if S[i]='{' then
P:=P+'{'; 
if (S[i]='}')then
begin
if (P[length(P)]='{') then
delete(P,length(P),1) 
else
begin
r:=i;
break;
end;
end;
 
if S[i]='[' then
P:=P+'[';
if (S[i]=']')then
begin
if (P[length(P)]='[') then
delete(P,length(P),1) 
else
begin
r:=i;
break;
end;
end;
end;
 
if (length(P) > 0)and(i=length(S)) then
r:=-1; 
Writeln('Ответ: ',r);
end.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.01.2016, 16:42
Ответы с готовыми решениями:

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

Проверка правильности расстановки скобок
Задача Bracket. В сложных математических выражениях приходится иногда ставить...

Проверка правильности расстановки скобок
Преподаватель поставила сегодня в тупик вопросом. Как с помощью оператора...

Текстовый файл. Проверка расстановки скобок
Проверить, правильно ли расставлены в тексте, расположенном в текстовом файле,...

Проверка правильности расстановки скобок в тесте программы
Ребят вот помогите почему то выдает ошибку это Pascal ABC var h,m,k:integer;...

14
Catstail
Модератор
23735 / 11819 / 2066
Регистрация: 12.02.2012
Сообщений: 19,223
07.01.2016, 19:46 2
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Что-то не нравится мне этот код... Эту задачу положено решать не так.

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
Program P16;
 
Var Arr : Array[1..1000] of char;
Var Ptr : integer;
 
Procedure Init;
var i : integer;
Begin
    for i:=1 to 1000 Do Arr[i]:=' ';
    Ptr:=0;
End;
 
Procedure Push(c : char);
Begin
    inc(Ptr);
    Arr[ptr]:=c;
End;
 
Function Pop : char;
Begin
    Pop:=Arr[Ptr];
    Ptr:=Ptr-1;
End;
 
Procedure CheckPar( Stri : String);
Var i,j,k : Integer;
Var s,a   : char;
Var Ope   : String;
Var Clo   : String;
Begin
     Init();
     Ope:='([{';
     Clo:=')]}';
     for i:=1 to length(Stri) Do Begin
         s:=Stri[i];
         if pos(s,Ope) > 0 then Push(s);
         k:=pos(s,Clo);
         if k > 0 then Begin
            if Ptr=0 then Begin
               writeln(i);
               break;
            end
            else Begin
               a:=Pop();
               if a <> Ope[k] Then Begin
                  writeln(i);
                  break;
               end;
            End;
         End;
     End;
     if Ptr <> 0 then
        Writeln(-Ptr)
     else
        writeln('OK');
        
End;
 
Var S : String;
 
Begin
 
    write('Enter string: ');
    readln(S);
    CheckPar(S);
    
End.
1
shoroh_msu
52 / 10 / 12
Регистрация: 28.12.2015
Сообщений: 41
07.01.2016, 20:17 3
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Решение такое же, но поскольку уже решил:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
program task;
const
    open = [ '{', '[', '(' ];
    close = [ '}', ']', ')' ];
    n = 10;
type
    str = packed array[ 1..n ] of char;
    stack = ^chain;
    chain = record
        item: char;
        next: stack
    end;
var
    st: str;
    s: stack;
    ok: boolean;
    i: integer;
    c, c1: char;
    
procedure clearstack( var s: stack );
begin
    if s <> nil then begin
        clearstack( s^.next );
        dispose( s );
        s := nil;
    end;
end;
 
function isempty( s: stack ): boolean;
begin
    isempty := s = nil;
end;
 
procedure pop( var s: stack; var c: char );
var
    q: stack;
begin
    c := s^.item;
    q := s;
    s := s^.next;
    dispose( q );
end;
 
procedure push( var s: stack; c: char );
var
    q: stack;
begin
    q := s;
    new( s );
    s^.item := c;
    s^.next := q;
end;
 
procedure readstr( var st: str );
var
    i: integer;
begin
    for i := 1 to n do read( st[ i ] );
end;
 
begin
s := nil;
ok := true;
i := 1;
readstr( st );
while ok and ( i < n + 1 ) do begin
    c := st[ i ];
    if c in open then push( s, c ) 
    else
        if c in close then 
            if isempty( s ) then begin
                ok := false;
                writeln( i );
            end
            else begin
                pop( s, c1 );
                ok := ( c1 = '(' ) and ( c = ')' ) or
                    ( c1 = '{' ) and ( c = '}' ) or ( c1 = '[' ) and ( c = ']' );
                if not ok then writeln( i );
            end;    
    i := i + 1;         
end;
if ok then
    if not isempty( s ) then writeln( -1 )
    else writeln( 0 );
clearstack( s );
end.
1
Cyborg Drone
Модератор
5398 / 3208 / 2450
Регистрация: 17.08.2012
Сообщений: 10,280
07.01.2016, 22:10 4
Таблица рекордов:

НикДлина программыМесто
shoroh_msu87 строк1 место
Catstail67 строк2 место
Ksenia_rth58 строк3 место

Попробую побороться за лидерство...
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
var i, a, b, c, d: integer;
    s: string;
begin
  a := 0;
  b := 0;
  c := 0;
  writeln('Введите строку:');
  readln(s);
  for i := 1 to length(s) do
    begin
      case s[i] of
        '(': inc(a);
        ')': dec(a);
        '[': inc(b);
        ']': dec(b);
        '{': inc(c);
        '}': dec(c)
      end;
      d := a or b or c;
      if d < 0
        then begin
          writeln(i);
          break
        end
    end;
  if d > 0
    then writeln(-1)
    else if d = 0
      then writeln(0)
end.
Эх... За лидерами ну никак не угнаться...
1
shoroh_msu
52 / 10 / 12
Регистрация: 28.12.2015
Сообщений: 41
07.01.2016, 23:08 5
Ну, у меня крутое навороченное решение со стеком, все дела, плюс 100 % по стандарту Паскаля.
0
Cyborg Drone
Модератор
5398 / 3208 / 2450
Регистрация: 17.08.2012
Сообщений: 10,280
08.01.2016, 00:13 6
Так и у меня всё стандартно... Это, что ли, смущает?
Pascal
19
      d := a or b or c;
Поразрядные логические операции в паскале были изначально, от Никлауса Вирта. Стандартней некуда.

И по заданию незачем со стеком... Зачем из пушки по воробьям-то?

Добавлено через 9 минут
Забыл написать. При желании можно заменить на стандартное
Pascal
19
       if (a < 0) or (b < 0) or (c < 0) then d := -1 else d := a + b + c;
0
shoroh_msu
52 / 10 / 12
Регистрация: 28.12.2015
Сообщений: 41
08.01.2016, 00:32 7
При входных данных ( [ { ] } ) ваша программа выдаст 0, хотя скобки расставлены неверно. Если говорить о стандарте, то там нет ни типа string, ни оператора break.
0
Cyborg Drone
Модератор
5398 / 3208 / 2450
Регистрация: 17.08.2012
Сообщений: 10,280
08.01.2016, 01:06 8
Цитата Сообщение от shoroh_msu Посмотреть сообщение
ваша программа выдаст 0
Знаю, но заданию это не противоречит.
0
Антон1985
116 / 87 / 93
Регистрация: 03.02.2014
Сообщений: 367
08.01.2016, 05:33 9
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
const
  tabScob: array[0..1,1..3]of char =
    (('{', '[', '('),
     ('}', ']', ')'));
var
  i,j,l,f: integer;
  s, ss: string;
begin
  { ввод строки }
  writeln('Введите строку: ');
  readln(s);
  { анализ строки }
  j:=0;
  f:=0;
  for i := 1 to length(s) do
  begin
      for l:=1 to 3 do
        if s[i] = tabScob[0,l] then
        begin
          Inc(j);
          ss[j]:=s[i];
        end
        else
        if s[i] = tabScob[1,l] then
          if j=0 then
            f:=-1
          else
            if ss[j] = tabScob[0,l] then
              Dec(j)
            else
              f:=1;
      if f<>0 then
        break;
  end;
  { вывод сообщение об результате анализа строки }
  case f of
    1: writeln('Ошибка. Позиция в строке - ', i);
    0: if j=0 then
         writeln(0)
       else
         writeln(-1);
    -1: writeln(-1);
  end;
end.
Результат программы:
Код
Введите строку: 
{[]
-1
Введите строку: 
[])
-1
Введите строку: 
[{(})]
Ошибка. Позиция в строке - 4
Введите строку: 
[{()}]
0
1
Catstail
Модератор
23735 / 11819 / 2066
Регистрация: 12.02.2012
Сообщений: 19,223
08.01.2016, 11:07 10
Cyborg Drone, боюсь, что Ваш код неверен в принципе (если, конечно, я верно понял суть). Для скобок одного вида он совершенно правилен, но для скобок уже двух видов нужен стек. Как Ваш код обработает вот такую структуру: "(a[b)]" ? Счетчики равны, а структура - увы...
0
Cyborg Drone
Модератор
5398 / 3208 / 2450
Регистрация: 17.08.2012
Сообщений: 10,280
08.01.2016, 12:17 11
Catstail, знаю. Но, формально, всё по заданию.
0
shoroh_msu
52 / 10 / 12
Регистрация: 28.12.2015
Сообщений: 41
08.01.2016, 12:46 12
Судя по заголовку программы, чуваку лабу сдавать, преподавтель введет ( [ ) ] и скажет, что это подразумевалось в условии.
0
Cyborg Drone
Модератор
5398 / 3208 / 2450
Регистрация: 17.08.2012
Сообщений: 10,280
08.01.2016, 12:54 13
Кстати, да... Об этом я как-то не подумал. Никуда моя программа не годится.
0
Антон1985
116 / 87 / 93
Регистрация: 03.02.2014
Сообщений: 367
09.01.2016, 12:23 14
Описание задачи:
Цитата Сообщение от Ksenia_rth Посмотреть сообщение
Дана строка, содержащая латинские буквы и скобки трех видов ( ), { }, [ ]. Если скобки расставлены правильно (то есть каждой открывающей соответствует закрывающая скобка того же вида), то вывести 0. В противном случае вывести или номер позиции, в которой расположена первая ошибочная скобка или, если закрывающих скобок не хватает, число -1.
Если по внимательней почитать условия задачи, то обнаружится, что не хватает описания одного случая - что делать (какое сообщение выводить), если закрывающих скобок окажется больше открывающих? В моей программе описанном в посте #9 такой случай приравнивается к случаю, если закрывающих скобок не хватает.
0
shoroh_msu
52 / 10 / 12
Регистрация: 28.12.2015
Сообщений: 41
09.01.2016, 15:27 15
Скорее нужно вывести номер первой лишней закрывающей скобки.
0
09.01.2016, 15:27
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.01.2016, 15:27

Дана строка. Проверить, одинаковое ли число в ней открывающих и закрывающих скобок.
Дана строка. Проверить, одинаковое ли число в ней открывающих и закрывающих...

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

1.В заданном предложении проверить парность расстановки круглых скобок. Вложение скобок допускается. 2. Заданы два массива A и B одинаковой размерност
1.В заданном предложении проверить парность расстановки круглых скобок....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru