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

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Рекурсивная функция, Удаление символов
Restinpiece
сообщение 13.12.2007 16:58
Сообщение #1





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

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


У меня вот такая задача в Delphi:
Задана строка, которая содержит в себе правильную запись со скобками, например ((ав)с(d((l)f))). Удалить из строки все символы, кроме скобок. Задачу нужно решить с помощью рекурсивной процедуры или функции.
Вроде функция сделана, но почему то работает не совсем правильно:оставляет только первіе четыре скобки. Помогите пожалуйста, а то не могу понять, в чем причина.
Код
function recurs(s: string): string;
begin
   if (s='') or (pos('(',s)=0) and (pos(')', s)=0) then recurs:=''
   else
      if (pos('(',s) > pos(')', s)) and (0< pos(')', s)) or (pos('(',s)=0) then
                 recurs:= ')'+recurs(copy(s, pos(')', s)+1, length(s)-pos(')', s)-2))
     else
                 recurs:= '(' +recurs(copy(s, pos('(', s)+1, length(s)-pos('(', s)-2));
end;

Вызываю функцию так:
Код
writeln(recurs('((ав)с(d((l)f)))'));

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Malice
сообщение 13.12.2007 17:50
Сообщение #2


Профи
****

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

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


А по-простетски нельзя ?

function f(s:string):string;
begin
if s='' then f:='' else
if s[1] in ['(',')'] then
f:=s[1] +f(copy (s,2,255))
else
f:=f(copy(s,2,255));
end;

rolleyes.gif
Или обязательно иметь ввиду, что выражение со скобками ?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Restinpiece
сообщение 13.12.2007 20:50
Сообщение #3





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

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


а, спасибо, так работает. Только не могу понять, почему 255?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Malice
сообщение 13.12.2007 21:20
Сообщение #4


Профи
****

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

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


Цитата(Restinpiece @ 13.12.2007 20:50) *

а, спасибо, так работает. Только не могу понять, почему 255?

На паскале максимальная длина строки 255 символов, по-этому поставив 255 в любом случае скопируется весь остаток. Но, конечно, лучше поставить (Length(s)-1), будет корректней.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 



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