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

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

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

 
 Ответить  Открыть новую тему 
> расщепление строки, исправить
сообщение
Сообщение #1





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

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


Имеется строка: A+B, A+C, D+B
Нужно получить все комбинации этих связок:
A,A,D A,A,B
A,C,D A,C,B

B,A,D B,A,B
B,C,D B,C,B
 
uses crt;
type uk = ^P;
P = record
next : uk;
str : string;
end;
var i,n : byte;
t,q : uk;
stroka : string;
procedure division (var q : uk; var s : string);
var n : byte;
s1,s2 : string;
t : uk;
begin
t := q;
n := pos('+',t^.str);
while n <> 0 do
begin
s1 := s[n-1];
s2 := s[n+1];
delete(s,n-2,4);
while t<>Nil do
t := t^.next;
new(t);
t^.next := q;
t^.str := s1 + ',' + s;
q := t;
new(t);
t^.next := q;
t^.str := s2 + ',' + s;
q := t;
s := t^.str;
n := pos('+',t^.str);
end;
end;
Begin
clrscr;
stroka := 'A+B,^C+^D,B,B+C';
n := pos('^',stroka);
while n <> 0 do
begin
stroka[n+1] := chr(ord(stroka[n+1])+32);
delete(stroka,n,1);
n := pos('^',stroka);
end;
q := Nil;
new(t);
t^.next := q;
t^.str := stroka;
q := t;
division(q,stroka);
t := q;
while t<>Nil do
begin
division(t,stroka);
t := t^.next;
end;
while q<> Nil do
begin
writeln(q^.str);
q := q^.next;
end;
readkey;
end.

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


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

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


Внимание, новинка сезона. Вариант "вынеси мозг преподавателю" smile.gif Я даже под спойлер не решился положить, присоединил файлом. Слабонервным - не смотреть. Но работает...

Прикрепленный файл  splitter.pas ( 1.57 килобайт ) Кол-во скачиваний: 511

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


Гость






> Внимание, новинка сезона. Вариант "вынеси мозг преподавателю"

А что там такого-то... Ну рекурсий много, и всё.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

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


Цитата(IUnknown @ 13.05.2011 16:43) *
Внимание, новинка сезона. Вариант "вынеси мозг преподавателю" smile.gif Я даже под спойлер не решился положить, присоединил файлом. Слабонервным - не смотреть. Но работает...
Я извиняюсь, не послушался доброго совета, посмотрел )).
Уфф.. ниасилил, как грится, слишком много букавок (С)

Цитата(-TarasBer- @ 13.05.2011 16:48) *
А что там такого-то... Ну рекурсий много, и всё.
Соглашусь.

Осмелюсь выложить и свою буратинку.. Я полагаю, что подразумевается, видимо, использование списков )). Но в условии это не отмечено, и мне кажется, тут не надо усложнять, так что я привожу совсем простое решение - без списков, рекурсий и т.п... smile.gif Просто на всякий случай (и чтоб у автора темы не сложилось впечатление, что можно только сложно), вот:
var
s: string;
i,j: integer;

begin
s:= 'A+B, A+C, D+B';
for i:=0 to 1 shl (Length(s) div 5+1)-1 do begin
for j:=0 to Length(s) div 5 do Write(s[2*(i shr j and 1)+1+j*5]);
WriteLn
end
end.

Решение жестко приязано к формату входной строки (односимвольные параметры разделены плюсом в парах и запятой с пробелом между парами). Поскольку про него ничего не сказано, я считал его точным. Если нужно отвязаться - нужно делать подготовку строки (еще одна строчка, но тело цикла немного упростится). Но это не значит, что нельзя задать более длинную (или короткую) строку. Например: 'A+B, A+C, D+B, X+Y, Z+z' - вполне годится )).


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 





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