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

> Внимание!

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

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

> э-э-э .. просто скобки., разбор выражений со скобками
сообщение
Сообщение #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]
Подскажите, как быть в такой ситуации?

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


Michael_Rybak
*****

Группа: Пользователи
Сообщений: 1 046
Пол: Мужской
Реальное имя: Michael_Rybak

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


В таком случае посмотри обратную польскую запись.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


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

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

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


Пожалуйста помогите разобраться с прогой, всё не могу довести её до ума.
Сейчас она корректно вроде разбирается с выражением, где каждый вид скобок ('(', '[', '{', '<') встречается лишь однажды. Например, если вводим (ma)[pa]<da>, то выводится
(ma)
[pa]
<da>
а если вводим (ma[pa]da)<ya> , то программа выдаст
(ma[pa]da)
[pa]
<ya>
То есть найдя с начала строки скобку, ищем такую же с конца. Потом запоминаем место ,где нашли первую скобку, идем в рекурсию, и так до конца строки.
Но например если вводим (ma)(ma)[pa], то уже возникают проблемы, надо
(ma)
(ma)
[pa], а прога естественно выводит
(ma)(ma)
[pa], потому что ищет такую же скобку с конца! Нет, можно было бы конечно, искатбь закрывающуюся скобку с начала строки, но тогда еси мы введем такое выражение (ma)(ma){pa{pa}da} получится
(ma)
(ma)
{pa{pa}
{pa}
неправильно же! надо
(ma)
(ma)
{pa{pa}da}
{pa}
В-общем, я совсем запуталась..есть ли у кого-нибудь идеи?


#include <stdio.h>
#include <string.h>
#include <conio.h>
int dlina_stroki;
char stroka[80];

void f1 (char s1[80],int i)
{
int n,k; char ch;
while (s1[i]!= '(' && s1[i] != '[' && s1[i] != '{' && s1[i] != '<') {i=i+1;}

switch (s1[i])
{
case '(': {ch=')'; break;}
case '[': {ch=']'; break;}
case '<': {ch='>'; break;}
case '{': {ch='}'; break;}
}
n=i;
i=dlina_stroki;
while (s1[i] != ch) {i=i-1;}
k=i;
for (i=n; i<=k; i++)
printf("%c",s1[i]);
i=n+1;
if (i<dlina_stroki) { printf("\n%c",' '); f1(s1,i);}
}

void main(void)
{ int i;
clrscr();
printf("Enter the string please\n");
gets(stroka);
dlina_stroki=strlen(stroka);
i=0;
f1(stroka,i);
}

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Профи
****

Группа: Пользователи
Сообщений: 705
Пол: Мужской

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


Цитата(Тёмный Эльф @ 26.04.2007 22:16) *

То есть найдя с начала строки скобку, ищем такую же с конца

А надо не с конца искать, а продолжать от скобки вперед. т.е. нашел скобку "(", идешь вперед и ищещь соответствующую закрывающую (Заводишь счетчик, к нему +1, если попадалась открывающая, -1 -закрывающая - на нужной закрывающей счетчик будет = 0).
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


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

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

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


Цитата
А надо не с конца искать, а продолжать от скобки вперед. т.е. нашел скобку "(", идешь вперед и ищещь соответствующую закрывающую


но если мы будем продолжать от скобки вперед ,то например, такое выражение
(ma(da)ma) прога выведет как
(ma(da)
(da)ma), а надо:
(ma(da)ma)
(da)
или все дело в счетчике? я не совсем поняла его роль , можно пожалуйста поподробнее?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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


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

 





- Текстовая версия 3.05.2024 21:48
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name