Проверить текст на соответствие числа открывающихся и закрывающихся скобок - 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 ); }
Объяснение кода листинга программы
- В функции
bracket_pos
проверяется, является ли входной строка пустой. Если это так, функция возвращает-1
. - В функции
bracket_pos
создаются две переменныеbracket_opened
иbracket_closed
, которые будут использоваться для отслеживания открытых и закрытых скобок соответственно. - В функции
bracket_pos
используется операторswitch
для определения типа скобки, которую нужно отследить. - В функции
bracket_pos
вызывается функцияbracket_pos_
, передавая ей входную строку, открывающую скобку и закрывающую скобку. - В функции
bracket_pos_
инициализируются переменныеpos
,last_opened_pos
,opened
иclosed
со значениями 0. - В функции
bracket_pos_
используется циклdo
, чтобы пройти через каждый символ входной строки. - В функции
bracket_pos_
проверяется, является ли текущий символ закрывающей скобкой. Если это так, увеличивается значениеclosed
. - В функции
bracket_pos_
проверяется, является ли текущий символ открывающей скобкой. Если это так, увеличивается значениеopened
, и еслиopened
равноclosed
, то обновляется значениеlast_opened_pos
. - В функции
bracket_pos_
используется операторif
, чтобы проверить, превышает ли количество закрывающих скобок количество открывающих скобок. Если это так, функция возвращает позицию открывающей скобки. - В функции
bracket_pos_
используется операторif
, чтобы проверить, равны ли количество открывающих и закрывающих скобок. Если это так, функция возвращает-2
. - В функции
bracket_pos_
возвращается значениеlast_opened_pos
, если количество открывающих и закрывающих скобок равно. - В функции
main
вызывается функцияbracket_pos
, передавая ей строкуHey, ( in brackets ) ( ... ((((
и символ ')'. - В функции
main
выводится значениеposition
. - Значение
position
представляет собой позицию закрывающей скобки в строке.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д