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