Другие языки программирования и технологии

задача в паскаль:дано математическое выражение определить правильно ли расставлены скобки

По большому счету, это невозможно
Выражения (2 + 3): 5 + (8 - 7)*2 И (2 + 3): (5 + 8) - 7*2 - это два разных выражения, но в них обоих скобки расставлены правильно. И неизвестно, как их хотел расставить автор.

Единственное, что можно сделать - проверить, что количество скобок "(" равно количеству скобок ")", и между соседними скобками "(" и ")" больше 1 знака, не учитывая пробелы, иначе получатся конструкции типа (8) или (+) или (), что неправильно.

На паскале не умею, а на Бейсике это будет так.
Formula - это строка с формулой, SkobkaLeft и SkobkaRight - это целые счетчики скобок
SkobkaLeft = 0: SkobkaRight = 0
i = 0: Priznak = TRUE
Do While i < Len(Formula)
intPoz1 = InStr(i+1, Formula, "(")
If intPoz1 > 0 Then SkobkaLeft = SkobkaLeft + 1
intPoz2 = InStr(i+1, Formula, ")")
If intPoz2 > 0 Then SkobkaRight = SkobkaRight + 1
If intPoz2 <= intPoz1 + 2 Then Priznak = FALSE
Loop
If (SkobkaLeft = SkobkaRight) AND (Priznak = TRUE) Then
MsgBox ("Формула правильная")
Else
MsgBox ("Формула неправильная")
End If

Matod правильно написал, но я считал, что выражение - это просто выражение, которое надо например упростить, а не равенство и не неравенство.
Если еще и это учитывать, то надо добавлять соответствующие проверки
Viktor Lukoic
Viktor Lukoic
75 895
Лучший ответ
Задача сложнее, чем кажется на первый взгляд. Простой подсчет открывающих и закрывающих не дает ответа, правильно ли они расставлены. Если найден дисбаланс, то конечно, неправильно. Но если дисбаланса нет, то это еще ни о чем не говорит. Например, в выражении (а<)=б.

Для полного ответа не обойтись без разбора выражения - перобразования строки в дерево, узлами которых являются операции, а ветвями - операнды. При разборе выражения можно обнаружить ошибки, правда там нельзя будет однозначно ответить на вопрос, скобки виноваты или что-то еще. В приведенном примере можно считать, что это скобка не на месте, а можно воспринять как отсутствие операнда для операции сравнения.
В принципе, Павел в ответе выше дал неплохую идею.. . Уточню только, что 0 должен быть не в результате, иначе спокойно пройдет, например, последовательность )))(((

Поэтому условием правильности должна быть проверка этой переменной на неотрицательность (k >= 0) внутри выражения и k = 0 - в конце...
Алексей Гусев
Алексей Гусев
23 519
строку читаешь по символьно, когда скобка открываешься прибавляешь к переменной 1, когда закрывается убавляешь. если в результате 0 - БИНГО!.