IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным. В описании темы указываем язык!!!

> э-э-э .. просто скобки., разбор выражений со скобками
Тёмный Эльф
сообщение 19.04.2007 23:42
Сообщение #1


Влюблённый псих
***

Группа: Пользователи
Сообщений: 185
Пол: Женский
Реальное имя: Лейла

Репутация: -  1  +


Хочу написать прогу, которая разбирает выражения со скобками, например, если
(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
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
volvo
сообщение 30.04.2007 1:24
Сообщение #2


Гость






Цитата
Вроде все цивильно
С точки зрения синтаксиса (в логике - не разбирался, поздно уже smile.gif ) - не совсем...

if (s1[i]=ch_1) kok=kok+1; // <--- Это что, сравнение?
if (s1[i]=ch) kok=kok-1; // и это тоже?
Только в С/С++ сравнение - это двойной знак равенства...
 К началу страницы 
+ Ответить 
Тёмный Эльф
сообщение 30.04.2007 18:59
Сообщение #3


Влюблённый псих
***

Группа: Пользователи
Сообщений: 185
Пол: Женский
Реальное имя: Лейла

Репутация: -  1  +


Цитата
С точки зрения синтаксиса (в логике - не разбирался, поздно уже smile.gif ) - не совсем...


да равенство неверно было записано.. но там не из-за этого бред выходит.. в логике дело.

Сообщение отредактировано: Тёмный Эльф - 30.04.2007 18:59
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Тёмный Эльф
сообщение 30.04.2007 19:22
Сообщение #4


Влюблённый псих
***

Группа: Пользователи
Сообщений: 185
Пол: Женский
Реальное имя: Лейла

Репутация: -  1  +


Все равно не понимаю, где ошибка!
Вот в мэйн я присваиваю 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 меньше длины строки! хм. а почему здесь "и" ? вроде же...вроде "или" должен стоять! или или. blink.gif потом проверю)

после этого мы находим положение закрывающейся скобки и запоминаем его: 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);}

Вроде логично.. вот только & там должен стоять или && надо проверить dry.gif

Сообщение отредактировано: Тёмный Эльф - 30.04.2007 19:23
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
Тёмный Эльф   э-э-э .. просто скобки.   19.04.2007 23:42
Michael_Rybak   Вообще не очень понятно, чего именно ты хочешь, но...   20.04.2007 1:37
klem4   А то что баланс скобок не соблюден это нормально...   20.04.2007 7:42
Тёмный Эльф   Не-е баланс скобок обязателен конечно. Это я сглюч...   20.04.2007 7:54
Michael_Rybak   В таком случае посмотри обратную польскую запись.   20.04.2007 12:57
Тёмный Эльф   Пожалуйста помогите разобраться с прогой, всё не м...   26.04.2007 21:16
Malice   То есть найдя с начала строки скобку, ищем такую ...   26.04.2007 21:38
Тёмный Эльф   но если мы будем продолжать от скобки вперед ,то...   26.04.2007 22:00
volvo   (ma(da)ma) первая открывающаяся скобка - счетчик п...   26.04.2007 22:17
Тёмный Эльф   ну наконец то дошло..спасибо! буду реализовать...   26.04.2007 22:21
Тёмный Эльф   Хм.. я что-то делаю не так? Не понимаю ,где ошибка...   29.04.2007 22:01
volvo   С точки зрения синтаксиса (в логике - не разбиралс...   30.04.2007 1:24
Тёмный Эльф   да равенство неверно было записано.. но там не ...   30.04.2007 18:59
Тёмный Эльф   Все равно не понимаю, где ошибка! Вот в мэйн ...   30.04.2007 19:22
volvo   А чего ты гадаешь? :) & - это побитовая операц...   30.04.2007 19:28
Тёмный Эльф   А чего ты гадаешь? :) & - это побитовая опера...   30.04.2007 19:30
volvo   Ты упустила еще одно: while (i <= dlina_stroki ...   30.04.2007 20:23
Тёмный Эльф   точно. спасибо.   30.04.2007 21:23


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 26.07.2025 13:19
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"