По большому счету, это невозможно
Выражения (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 правильно написал, но я считал, что выражение - это просто выражение, которое надо например упростить, а не равенство и не неравенство.
Если еще и это учитывать, то надо добавлять соответствующие проверки
Другие языки программирования и технологии
задача в паскаль:дано математическое выражение определить правильно ли расставлены скобки
Задача сложнее, чем кажется на первый взгляд. Простой подсчет открывающих и закрывающих не дает ответа, правильно ли они расставлены. Если найден дисбаланс, то конечно, неправильно. Но если дисбаланса нет, то это еще ни о чем не говорит. Например, в выражении (а<)=б.
Для полного ответа не обойтись без разбора выражения - перобразования строки в дерево, узлами которых являются операции, а ветвями - операнды. При разборе выражения можно обнаружить ошибки, правда там нельзя будет однозначно ответить на вопрос, скобки виноваты или что-то еще. В приведенном примере можно считать, что это скобка не на месте, а можно воспринять как отсутствие операнда для операции сравнения.
Для полного ответа не обойтись без разбора выражения - перобразования строки в дерево, узлами которых являются операции, а ветвями - операнды. При разборе выражения можно обнаружить ошибки, правда там нельзя будет однозначно ответить на вопрос, скобки виноваты или что-то еще. В приведенном примере можно считать, что это скобка не на месте, а можно воспринять как отсутствие операнда для операции сравнения.
В принципе, Павел в ответе выше дал неплохую идею.. . Уточню только, что 0 должен быть не в результате, иначе спокойно пройдет, например, последовательность )))(((
Поэтому условием правильности должна быть проверка этой переменной на неотрицательность (k >= 0) внутри выражения и k = 0 - в конце...
Поэтому условием правильности должна быть проверка этой переменной на неотрицательность (k >= 0) внутри выражения и k = 0 - в конце...
строку читаешь по символьно, когда скобка открываешься прибавляешь к переменной 1, когда закрывается убавляешь. если в результате 0 - БИНГО!.
Похожие вопросы
- Задача в паскале: реализовать рекурсивный алгоритм правильности расстановки скобок
- Pascal. Помогите пожалуйста решить задачу в паскале !
- ПОМОГИТЕ С ЗАДАЧАМИ В ПАСКАЛЕ
- Помогите, пожалуйста с задачей :( Сижу, туплю уже какой день, вообще не соображу - чтокуда. Задача на Паскале
- Решение задач по паскалю
- Помогите до решать задачу на паскале
- Составьте задачу в паскале!!
- Помогите решить задачи по Паскалю
- Задача по Паскалю (1 курс)
- помогите решить задачу на паскале: напечатать "столбиком" значения sin2, sin3, ..sin 20.