Форум программистов, компьютерный форум, киберфорум
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/15: Рейтинг темы: голосов - 15, средняя оценка - 4.93
0 / 0 / 0
Регистрация: 01.07.2013
Сообщений: 3

Помощь по задаче "баланс скобок"

01.07.2013, 19:51. Показов 3066. Ответов 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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
program Project1;
 
const
  (*Открывающие скобки.*)
  D1 = ['(', '[', '{'];
  (*Закрывающие скобки.*)
  D2 = [')', ']', '}'];
 
var
  (*Анализируемая строка.*)
  StrSrc: String;
  (*True - согласованы. False - иначе.*)
  Balance: Boolean;
  
  (*Переменные для организации работы стека.*)
  Stack: array[1..100] of Char;
  StackPnt: Integer;
 
(*Подпрограммы для работы со стеком.*)
 
(*Добавить в стек элемент.*)
procedure StackPush(const aCh: Char);
begin
  Inc(StackPnt);
  Stack[StackPnt] := aCh;
end;
 
(*Взять из стека элемент.
True - стек не пуст, через параметр aCh возвращён элемент из вершины стека.
False - стек пуст.*)
function StackPop(var aCh: Char): Boolean;
begin
  StackPop := False;
  if StackPnt > 0 then begin
    aCh := Stack[StackPnt];
    Dec(StackPnt);
    StackPop := True;
  end;
end;
 
(*Для закрывающей скобки возвращает соответствующую открывающую скобку.*)
function GetOpen(const aCh: Char): Char;
begin
  case aCh of
    ')': GetOpen := '(';
    ']': GetOpen := '[';
    '}': GetOpen := '{';
  else
  (*Ошибка.*)
    GetOpen := '*';
  end;
end;
 
(*Анализ строки на предмет согласованности скобок.*)
procedure Proc;
var
  i: Integer;
  Ch: Char;
begin
  StackPnt := 0;
  Balance := True;
  for i := 1 to Length(StrSrc) do 
  begin
    if StrSrc[i] in D1 then begin
      (*Нашли открывающую скобку - добавляем её в стек.*)
      StackPush( StrSrc[i] );
    end else if StrSrc[i] in D2 then begin;
      (*Нашли закрывающу скобку - берём элемент из вершины стека.*)
      if StackPop(Ch) then begin
        (*Стек не пуст.*)
        if Ch <> GetOpen(StrSrc[i]) then begin
          (*Взятая из вершины стека скобка не соответствует текущей закрывающей скобке.
          Согласованность нарушена.*)
          Balance := False;
          Break;
        end;
      end else begin
        (*Стек пуст. Значит нет соответствия текущей закрывающей скобке.
        Согласованность нарушена.*)
        Balance := False;
        Break;
      end;
    end;
  end;
end;
 
 
procedure getFromFile();
var inFile: text;
inFileName: string;
begin
  writeln('Enter a file name');
  readln(inFileName);
  assign(inFile, inFilename);
  reset(inFile);
  while not eof(inFile) do
  begin
    readln(inFile, StrSrc);
    writeln(StrSrc);
    proc;
    if Balance then
    Writeln('Скобки согласованы.')
    else
    Writeln('Скобки не согласованы.');
 
  end;
  close(inFile);
end;
 
begin
  getfromfile;
  readln;
end.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.07.2013, 19:51
Ответы с готовыми решениями:

Баланс открывающихся и закрывающихся скобок
Проверить, имеются ли в заданном тексте баланс открывающихся и закрывающихся скобок.

Проверить баланс скобок в строке
Дана строка символов s, в которой могут быть скобки двух типов круглые и квадратные. Проверить баланс скобок. Пример: '1(2', выход: баланс...

Определить баланс скобок в тексте
Здравствуйте! Мне нужно написать программу, проверяющую введенную скобочную последовательность на то, является ли она правильной или...

2
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
01.07.2013, 22:22
Цитата Сообщение от 4Juice Посмотреть сообщение
Когда я пишу"("-он мне пишет,что скобки не согласованны.
Когда я пишу"{()"-опять пишет,что согласованны..не пойму,почему
Оба эти варианта дают вариант "согласованны", что в общем-то вполне логично. Проанализируйте код: переменная Balance у вас изначально равна True. При наличии входной строки "(" выполнится условие в котором значение Balance нигде не меняется, после чего цикл завершается, а следовательно и результат будет положительным. То же касается и строки "{()": на первом шаге цикла '{' добавляется в стек; на втором на вершину стека попадает уже '('; на третьем встречается её парная скобка ')', после чего цикл завершается. Переменная Balance снова осталась без изменений При выходе из цикла вам нужно проверять пуст стек или нет. Замените Break в условиях на Exit(досрочный выход из процедуры) и после тела цикла добавьте
Pascal
1
Balance:= (StackPnt = 0); (*если стек не пуст значит скобки не согласованы*)
1
0 / 0 / 0
Регистрация: 01.07.2013
Сообщений: 3
01.07.2013, 22:31  [ТС]
Огромное спасибо!
Что-то я не заметил(
Благодарю!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.07.2013, 22:31
Помогаю со студенческими работами здесь

Проверить баланс открывающихся и закрывающихся скобок
Всем доброй ночи. Не спящие помогите с решением задач. Знаю, что простейшие, но с Паскалем очень и очень сложно. Буду очень благодарен! ...

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

Проверить баланс расстановки скобок в строке
Дана строка, содержащая несколько круглых скобок. Если скобки расставлены правильно (то есть каждой открывающей соответствует одна...

Проверить, имеется ли в формуле баланс открывающих и закрывающих скобок
Задача на обработку текстовых данных: Проверить, имеется ли в формуле баланс открывающих и закрывающих скобок.

Проверить, соблюдён ли в тексте баланс скобок трех видов
Здравствуйте, нужна небольшая помощь по программе со стеком. Хотелось бы узнать, что делает так называемая &quot;крышечка&quot;(^) на...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru