Вывести позицию незакрытой скобки - C (СИ)

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

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

Задача:

Вывести первую позицию незакрытой скобки. Есть код, но он выводит позицию не первую позицию.

Кто может помогите фиксануть, или предложите свою функцию по нахождению позиции.

Листинг программы
  1. #include <stdio.h>
  2. #include <ctype.h>
  3. #include <locale.h>
  4. ///#2 Функция для нахождения кол-ва скобок и проверка на расстановку
  5. int func(const char * text,char l, char r)// text - сюла передается текст // l/r - скобки
  6. {
  7. int count=0;//счётчик символов
  8. ///Кол-во L и R скобок
  9. int num_l=0;//кол-во скобок l
  10. int num_r=0;//...
  11. int count_l=0;//номер позиции скобки
  12. int count_r=0;//...
  13. while(*text){//пока цикл не пройдёт по всем симвролам из текста будет выполняться код
  14. count++;//если новый символ, то +1
  15. if(*text == l){//если встрелилась левая скобка...
  16. num_l++;//+1 к кол-ву левых
  17. count_l=count;//сохраняем её позицию
  18. }
  19. if(*text == r){//...
  20. num_r++;//...
  21. count_r=count;//...
  22. }
  23. text++;//переключает на следующий символ из текста ( если он есть )
  24. }
  25. ///Проверка на правильность расставления скобок и позиция не закрытой
  26. if( num_l == num_r ) printf("Все скобки закрыты!");
  27. else if( num_l > num_r ){
  28. printf("Не закрыта ЛЕВАЯ скобка!\n");
  29. printf("Номер позиции: %d\n",count_l);
  30. }
  31. else if( num_r > num_l ){
  32. printf("Не закрыта ПРАВАЯ скобка!\n");
  33. printf("Номер позиции: %d\n",count_r);
  34. }
  35. }
  36. ///#1 Начало
  37. void main(void)
  38. {
  39. setlocale(LC_ALL,"Rus");
  40. const char l='(',r=')';// постоянные а и б равыне скобкам
  41. const char *text = "(1+2)*(1+2)*1+2)";// TEXT
  42. printf("TEXT >\t\t%s\n\n",text);// \t - табуляция (отступ)
  43. func(text,l,r);//передаёт в фукнцию текс и скобки
  44. }

Решение задачи: «Вывести позицию незакрытой скобки»

textual
Листинг программы
  1. #include <stdio.h>
  2. int main()
  3. {
  4.     char str[] = "(dfghjk))(j)nmbv)))((vf(f)vbb((rt))])";
  5.     int i, count = 0, j = -1, flag = 0;
  6.     for(i = 0; str[i]; i++){
  7.         if(str[i] == '('){
  8.             if(!count)
  9.                 j = i;
  10.             count++;
  11.         }
  12.         if(str[i] == ')')
  13.             count--;
  14.         if(count < 0){
  15.             if(!flag){
  16.                 printf("First extra right bracket #%d\n", i);
  17.                 flag = 1;
  18.             }
  19.             count = 0;
  20.         }
  21.     }
  22.     if(j >= 0 && count)
  23.         printf("First extra left bracket #%d\n", j);
  24.     else
  25.         puts("Extra left bracket not found");
  26.     return 0;
  27. }

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

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

  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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы