1. Пользуйтесь тегами кода. - [code] ... [/code] 2. Точно указывайте язык, название и версию компилятора (интерпретатора). 3. Название темы должно быть информативным. В описании темы указываем язык!!!
Хочу написать прогу, которая разбирает выражения со скобками, например, если (6[0)888]{99} значит, прога выводит (6[0) [0)888] {99} возникла проблема с алгоритмом. Предположим, выражение представлено ввиде строки. Тогда я ищу первую открывающуюся скобку с начала строки, а затем соответствующую ей закрывающуюся скобку с конца строки и вывожу все ,что между ними, затем ищу вторую открывающуюся скобку ит.д. НО если я введу такое выражение [6(7]8[9]), то если действовать по этому алгоритму выведется совсем не то, что надо, а именно, [6(7]8[9] (7]8[9]) [9] а ведь должно быть [6(7] (7]8[9]) [9] Подскажите, как быть в такой ситуации?
Все равно не понимаю, где ошибка! Вот в мэйн я присваиваю i=0, после вызываю процедуру f1(stroka,i); В процедуре происходит вот что: сначала мы пробегаем по всей строке в поисках открывающейся скобки
while (s1[i]!= '(' && s1[i] != '[' && s1[i] != '{' && s1[i] != '<') {i=i+1;}. Можно было бы добавить еще сюда условие пока i!=dlina_stroki на случай если открывающейся скобки ниразу не встретилось, тогда в этом случае можно сразу реализовать выход из процедуры с сообщением об ошибке. Ну это ладно. Дальше что. Предположим нашли мы эту скобку, а дальше я ее определяю, чтобы была известн как открывающаяся скобка, так и закрывающаяся.
switch (s1[i]) { case '(': {ch=')'; ch_1='(';break;} case '[': {ch=']'; ch_1='[';break;} case '<': {ch='>'; ch_1='<';break;} case '{': {ch='}'; ch_1='{';break;} } И после этого идет присваение n=i, это значит положение открывающейся скобки, которую мы нашли.
После этого нужно найти закрывающуюся скобку. i=n+1; (будем искать закрывающуся скобку начиная со следующего положения) kok=1; (этот счетчик сколько скобок мы нашли. 1 уже есть потому что одна скобка уже найдена.)
а дальше цикл do-while
do {if (s1[i]==ch_1) kok=kok+1; (если нашли такую же скобку открытую то прибавим к счетчику) if (s1[i]==ch) kok=kok-1; (если нашли такую скобку но закрытую, то вычитаем) i=i+1; } while (kok != 0 & i<=dlina_stroki); (пока kok не равен нулю и i меньше длины строки! хм. а почему здесь "и" ? вроде же...вроде "или" должен стоять! или или. потом проверю)
после этого мы находим положение закрывающейся скобки и запоминаем его: k=i;
for (i=n; i<=k; i++) printf("%c",s1[i]); //здесь мы печатаем от начальной скобки до конечной найденной.
потом..а здесь я смещаю положение, типа первая скобка была на i=n, а дальше мы прибавляем единичку и начинам проделывать тоже самое, тоесть идем в рекурсию, только уже i будет равно не 0, как изначально, а прибавленная на 1. n будет соответственно каждый раз разное, когда-нибудь i достигнет значиения длины строки и произойдет выход из процедуры, а пока что printf("\n%c",' '); таким образом я пытаюсь перевести укзаатель на новую строчку и вызываем f1(s1,i); с новым значением i i=n+1; if (i<dlina_stroki) { printf("\n%c",' '); f1(s1,i);}
Вроде логично.. вот только & там должен стоять или && надо проверить