Поиск пары скобок - C (СИ)
Формулировка задачи:
пишу строковый калькулятор, никак не получается написать алгоритм поиска пары скобок помогите пожалуйста... подфункция должна выглядеть примерно так:
т.е. по указателям обратно возвращать должна найденные скобки, а возвращаемое значение - код ошибки (0 - скобки не найдены, 1 - скобки найдены, 2 - переданная строка не валидная), предполагается что туда уже будет подаваться строка без посторонних символов и с одинаковым количеством открывающих и закрывающих скобок (отсеется на предыдущих этапах парсинга)
unsigned parentheses(const char* expr, const char** open, const char** close);
пожалуйста помогите !!! уже всю голову сломал несколько дней думаю не могу никак сделать этот алгоритм !!!
вот если надо моя попытка, но не правильная все равно я знаю...
unsigned parentheses(const char* expr, const char** open, const char** close) { if (!expr) return 2; *open = strchr(expr, '('); for (const char* tmp = strchr(expr, '('); tmp; tmp = strchr(tmp, '(')) { *close = strchr(tmp++, ')'); if (*close < tmp) break; } if (*open && *close) return 1; return 0; }
Решение задачи: «Поиск пары скобок»
textual
Листинг программы
int strtofunc(const char* str, char** endptr) { if (strchr("^*/+-()", *str)) { if (endptr) *endptr = (char*)str + 1; switch (*str) { case '^': return 5; case '*': case '/': return 4; case '+': case '-': return 3; case '(': case ')': return 2; } } if (!(*str >= 'a' && *str <= 'z')) return 0; const char* functions[] = { "sin", "cos", "tg", "ctg", "ln", "log10" }; for (auto tmp : functions) { size_t len = strlen(tmp); for (size_t i = 0; i < len; i++) if (str[i] != tmp[i]) break; else if (i + 1 == len) { if (endptr) *endptr = (char*)&str[i + 1]; return 1; } } endptr = NULL; return 0; }
Объяснение кода листинга программы
- Функция
strtofunc
принимает два аргумента: строкуstr
и указатель на переменнуюendptr
. - Сначала проверяется, есть ли в строке символ, который может быть функцией (скобкой, знаком плюса или минуса, звездочкой, дефисом, логарифмом, десятичной запятой или вертикальной линией).
- Если такой символ есть, функция возвращает соответствующее число (5 для вертикальной линии, 4 для звездочки или дефиса, 3 для плюса или минуса, 2 для скобок).
- Если символа функции нет, проверяется, является ли первый символ строки буквой.
- Если это так, то функция сравнивает каждый символ строки с соответствующим символом в массиве функций.
- Если все символы совпадают, функция возвращает 1, указывая на то, что функция находится в массиве функций.
- Если символы не совпадают, функция продолжает искать функцию.
- Если ни одна функция не найдена, функция возвращает 0.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д