Вывести позицию незакрытой скобки - 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, чтобы указать, что программа успешно завершилась.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д