Помощь - Поиск - Пользователи - Календарь
Полная версия: расщепление строки
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
azzaq1
Имеется строка: 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.

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

Нажмите для просмотра прикрепленного файла
-TarasBer-
> Внимание, новинка сезона. Вариант "вынеси мозг преподавателю"

А что там такого-то... Ну рекурсий много, и всё.
Lapp
Цитата(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' - вполне годится )).
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.