Вывести позицию незакрытой скобки - C (СИ)
Формулировка задачи:
Задача:
Вывести первую позицию незакрытой скобки. Есть код, но он выводит позицию не первую позицию.Кто может помогите фиксануть, или предложите свою функцию по нахождению позиции.
#include <stdio.h> #include <ctype.h> #include <locale.h> ///#2 Функция для нахождения кол-ва скобок и проверка на расстановку int func(const char * text,char l, char r)// text - сюла передается текст // l/r - скобки { int count=0;//счётчик символов ///Кол-во L и R скобок int num_l=0;//кол-во скобок l int num_r=0;//... int count_l=0;//номер позиции скобки int count_r=0;//... while(*text){//пока цикл не пройдёт по всем симвролам из текста будет выполняться код count++;//если новый символ, то +1 if(*text == l){//если встрелилась левая скобка... num_l++;//+1 к кол-ву левых count_l=count;//сохраняем её позицию } if(*text == r){//... num_r++;//... count_r=count;//... } text++;//переключает на следующий символ из текста ( если он есть ) } ///Проверка на правильность расставления скобок и позиция не закрытой if( num_l == num_r ) printf("Все скобки закрыты!"); else if( num_l > num_r ){ printf("Не закрыта ЛЕВАЯ скобка!\n"); printf("Номер позиции: %d\n",count_l); } else if( num_r > num_l ){ printf("Не закрыта ПРАВАЯ скобка!\n"); printf("Номер позиции: %d\n",count_r); } } ///#1 Начало void main(void) { setlocale(LC_ALL,"Rus"); const char l='(',r=')';// постоянные а и б равыне скобкам const char *text = "(1+2)*(1+2)*1+2)";// TEXT printf("TEXT >\t\t%s\n\n",text);// \t - табуляция (отступ) func(text,l,r);//передаёт в фукнцию текс и скобки }
Решение задачи: «Вывести позицию незакрытой скобки»
textual
Листинг программы
#include <stdio.h> int main() { char str[] = "(dfghjk))(j)nmbv)))((vf(f)vbb((rt))])"; int i, count = 0, j = -1, flag = 0; for(i = 0; str[i]; i++){ if(str[i] == '('){ if(!count) j = i; count++; } if(str[i] == ')') count--; if(count < 0){ if(!flag){ printf("First extra right bracket #%d\n", i); flag = 1; } count = 0; } } if(j >= 0 && count) printf("First extra left bracket #%d\n", j); else puts("Extra left bracket not found"); return 0; }
Объяснение кода листинга программы
В данном коде осуществляется поиск позиции незакрытой скобки в строке.
- В первую очередь, в строку под именем
str
записывается данная строка:(dfghjk))(j)nmbv)))((vf(f)vbb((rt))])
. - Затем, создаются следующие переменные:
i
- счётчик, который будет использоваться в цикле;count
- счётчик скобок;j
- переменная для хранения позиции первой незакрытой скобки;flag
- флаг, который будет использоваться для проверки первой незакрытой скобки.
- Далее, с помощью цикла
for
осуществляется проход по каждому символу строкиstr
. - Если текущий символ равен '(' и переменная
count
равна 0, то запоминаем текущую позицию в переменнуюj
. - Увеличиваем значение переменной
count
на 1. - Если текущий символ равен ')', то уменьшаем значение переменной
count
на 1. - Если значение переменной
count
отрицательное, то:- Если переменная
flag
равна 0, то выводим сообщение с номером позиции первой незакрытой скобки и присваиваем значение переменнойflag
равное 1. - Устанавливаем значение переменной
count
равное 0.
- Если переменная
- После завершения цикла, проверяем значение переменной
j
иcount
. Еслиj
больше или равно 0 иcount
больше 0, то выводим сообщение с номером позиции первой незакрытой скобки. В противном случае, выводим сообщениеExtra left bracket not found
. - Возвращаем 0, чтобы указать, что программа успешно завершилась.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д