Поиск пары скобок - C (СИ)

Узнай цену своей работы

Формулировка задачи:

пишу строковый калькулятор, никак не получается написать алгоритм поиска пары скобок помогите пожалуйста... подфункция должна выглядеть примерно так:
unsigned parentheses(const char* expr, const char** open, const char** close);
т.е. по указателям обратно возвращать должна найденные скобки, а возвращаемое значение - код ошибки (0 - скобки не найдены, 1 - скобки найдены, 2 - переданная строка не валидная), предполагается что туда уже будет подаваться строка без посторонних символов и с одинаковым количеством открывающих и закрывающих скобок (отсеется на предыдущих этапах парсинга)
пожалуйста помогите !!! уже всю голову сломал несколько дней думаю не могу никак сделать этот алгоритм !!!
вот если надо моя попытка, но не правильная все равно я знаю...
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;
}

Объяснение кода листинга программы

  1. Функция strtofunc принимает два аргумента: строку str и указатель на переменную endptr.
  2. Сначала проверяется, есть ли в строке символ, который может быть функцией (скобкой, знаком плюса или минуса, звездочкой, дефисом, логарифмом, десятичной запятой или вертикальной линией).
  3. Если такой символ есть, функция возвращает соответствующее число (5 для вертикальной линии, 4 для звездочки или дефиса, 3 для плюса или минуса, 2 для скобок).
  4. Если символа функции нет, проверяется, является ли первый символ строки буквой.
  5. Если это так, то функция сравнивает каждый символ строки с соответствующим символом в массиве функций.
  6. Если все символы совпадают, функция возвращает 1, указывая на то, что функция находится в массиве функций.
  7. Если символы не совпадают, функция продолжает искать функцию.
  8. Если ни одна функция не найдена, функция возвращает 0.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 3.6 из 5
Похожие ответы