Вывести позицию незакрытой скобки - 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;
}

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

В данном коде осуществляется поиск позиции незакрытой скобки в строке.

  1. В первую очередь, в строку под именем str записывается данная строка: (dfghjk))(j)nmbv)))((vf(f)vbb((rt))]).
  2. Затем, создаются следующие переменные:
    • i - счётчик, который будет использоваться в цикле;
    • count - счётчик скобок;
    • j - переменная для хранения позиции первой незакрытой скобки;
    • flag - флаг, который будет использоваться для проверки первой незакрытой скобки.
  3. Далее, с помощью цикла for осуществляется проход по каждому символу строки str.
  4. Если текущий символ равен '(' и переменная count равна 0, то запоминаем текущую позицию в переменную j.
  5. Увеличиваем значение переменной count на 1.
  6. Если текущий символ равен ')', то уменьшаем значение переменной count на 1.
  7. Если значение переменной count отрицательное, то:
    • Если переменная flag равна 0, то выводим сообщение с номером позиции первой незакрытой скобки и присваиваем значение переменной flag равное 1.
    • Устанавливаем значение переменной count равное 0.
  8. После завершения цикла, проверяем значение переменной j и count. Если j больше или равно 0 и count больше 0, то выводим сообщение с номером позиции первой незакрытой скобки. В противном случае, выводим сообщение Extra left bracket not found.
  9. Возвращаем 0, чтобы указать, что программа успешно завершилась.

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

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