![]() |
1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!
![]() |
Тёмный Эльф |
![]() ![]()
Сообщение
#1
|
![]() Влюблённый псих ![]() ![]() ![]() Группа: Пользователи Сообщений: 185 Пол: Женский Реальное имя: Лейла Репутация: ![]() ![]() ![]() |
Хочу написать прогу, которая разбирает выражения со скобками, например, если
(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] Подскажите, как быть в такой ситуации? Сообщение отредактировано: Тёмный Эльф - 19.04.2007 23:43 |
![]() ![]() |
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
Цитата Вроде все цивильно С точки зрения синтаксиса (в логике - не разбирался, поздно уже ![]() if (s1[i]=ch_1) kok=kok+1; // <--- Это что, сравнение?Только в С/С++ сравнение - это двойной знак равенства... |
Тёмный Эльф |
![]()
Сообщение
#3
|
![]() Влюблённый псих ![]() ![]() ![]() Группа: Пользователи Сообщений: 185 Пол: Женский Реальное имя: Лейла Репутация: ![]() ![]() ![]() |
Цитата С точки зрения синтаксиса (в логике - не разбирался, поздно уже ![]() да равенство неверно было записано.. но там не из-за этого бред выходит.. в логике дело. Сообщение отредактировано: Тёмный Эльф - 30.04.2007 18:59 |
Тёмный Эльф |
![]()
Сообщение
#4
|
![]() Влюблённый псих ![]() ![]() ![]() Группа: Пользователи Сообщений: 185 Пол: Женский Реальное имя: Лейла Репутация: ![]() ![]() ![]() |
Все равно не понимаю, где ошибка!
Вот в мэйн я присваиваю 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);} Вроде логично.. вот только & там должен стоять или && надо проверить ![]() Сообщение отредактировано: Тёмный Эльф - 30.04.2007 19:23 |
![]() ![]() |
![]() |
Текстовая версия | 26.07.2025 13:19 |