![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() ![]() |
![]() |
azzaq1 |
![]()
Сообщение
#1
|
Группа: Пользователи Сообщений: 7 Пол: Мужской Репутация: ![]() ![]() ![]() |
Имеется строка: 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 |
![]()
Сообщение
#2
|
![]() a.k.a. volvo877 ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: ![]() ![]() ![]() |
Внимание, новинка сезона. Вариант "вынеси мозг преподавателю"
![]() ![]() |
-TarasBer- |
![]()
Сообщение
#3
|
Гость ![]() |
> Внимание, новинка сезона. Вариант "вынеси мозг преподавателю"
А что там такого-то... Ну рекурсий много, и всё. |
Lapp |
![]()
Сообщение
#4
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: ![]() ![]() ![]() |
Внимание, новинка сезона. Вариант "вынеси мозг преподавателю" Я извиняюсь, не послушался доброго совета, посмотрел )).![]() Уфф.. ниасилил, как грится, слишком много букавок (С) А что там такого-то... Ну рекурсий много, и всё. Соглашусь.Осмелюсь выложить и свою буратинку.. Я полагаю, что подразумевается, видимо, использование списков )). Но в условии это не отмечено, и мне кажется, тут не надо усложнять, так что я привожу совсем простое решение - без списков, рекурсий и т.п... ![]() 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' - вполне годится )). -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
![]() ![]() |
![]() |
Текстовая версия | 18.07.2025 1:42 |