Проверить текст на соответствие числа открывающихся и закрывающихся скобок - C (СИ)

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

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

Дан текстовый файл, содержащий программу на языке Си. Проверить эту программу на соответствие числа открывающихся и закрывающихся скобок (круглых, квадратных, фигурных и угловых). Как можно прочитать файл, чтобы была возможность проверять является ли текущий символ скобкой или нет? Пишу через построчное чтение, но не уверен, что пишу правильно и подходит ли этот способ вообще, помогите
p=fgets(s,80,f);
    if(p==NULL)
        printf("Файл закончился");
    else
        printf("Прочитана строка:\n%s",s);

Решение задачи: «Проверить текст на соответствие числа открывающихся и закрывающихся скобок»

textual
Листинг программы
#include <stdio.h>
 
size_t bracket_pos( const char *, char );
 
int main()
{
    size_t position = bracket_pos( "Hey, ( in brackets ) ( ... ((((", '(' );
    printf( "%d", (long)position );
}
 
size_t bracket_pos_( const char* str, char bt_o, char bt_c )
{
    size_t pos = 0;  /* current symbol of str */
    size_t last_opened_pos;
    size_t opened = 0, closed = 0;
    /* ---- ---- */
 
    do
    {
        if ( *str == bt_c ) closed += 1;
        if ( *str == bt_o )
        {
            if ( opened == closed ) last_opened_pos = pos;
            
            opened += 1;
        }
 
        if ( closed > opened ) return pos;
 
        pos += 1;
    }
    while ( *++str );
 
    if ( opened == closed ) return (size_t)-2;  /* ???? */
    
    return last_opened_pos;
}
 
size_t bracket_pos( const char* str, char bracket )
{
    if ( !str )  return (size_t)-1;
    if ( !*str ) return (size_t)-1;
    /* ---- ---- */
 
    char bracket_opened, bracket_closed;
 
    switch ( bracket )
    {
    case '(':
    case ')': bracket_opened = '('; bracket_closed = ')'; break;
 
    case '<':
    case '>': bracket_opened = '<'; bracket_closed = '>'; break;
 
    case '[':
    case ']': bracket_opened = '['; bracket_closed = ']'; break;
 
    case '{':
    case '}': bracket_opened = '{'; bracket_closed = '}'; break;
    
    default: return (size_t)-1;
    }
 
    return bracket_pos_( str, bracket_opened, bracket_closed );
}

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

  1. В функции bracket_pos проверяется, является ли входной строка пустой. Если это так, функция возвращает -1.
  2. В функции bracket_pos создаются две переменные bracket_opened и bracket_closed, которые будут использоваться для отслеживания открытых и закрытых скобок соответственно.
  3. В функции bracket_pos используется оператор switch для определения типа скобки, которую нужно отследить.
  4. В функции bracket_pos вызывается функция bracket_pos_, передавая ей входную строку, открывающую скобку и закрывающую скобку.
  5. В функции bracket_pos_ инициализируются переменные pos, last_opened_pos, opened и closed со значениями 0.
  6. В функции bracket_pos_ используется цикл do, чтобы пройти через каждый символ входной строки.
  7. В функции bracket_pos_ проверяется, является ли текущий символ закрывающей скобкой. Если это так, увеличивается значение closed.
  8. В функции bracket_pos_ проверяется, является ли текущий символ открывающей скобкой. Если это так, увеличивается значение opened, и если opened равно closed, то обновляется значение last_opened_pos.
  9. В функции bracket_pos_ используется оператор if, чтобы проверить, превышает ли количество закрывающих скобок количество открывающих скобок. Если это так, функция возвращает позицию открывающей скобки.
  10. В функции bracket_pos_ используется оператор if, чтобы проверить, равны ли количество открывающих и закрывающих скобок. Если это так, функция возвращает -2.
  11. В функции bracket_pos_ возвращается значение last_opened_pos, если количество открывающих и закрывающих скобок равно.
  12. В функции main вызывается функция bracket_pos, передавая ей строку Hey, ( in brackets ) ( ... (((( и символ ')'.
  13. В функции main выводится значение position.
  14. Значение position представляет собой позицию закрывающей скобки в строке.

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

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