Консультация № 160990
20.02.2009, 13:45
0.00 руб.
0 9 1
Здравствуйте, уважаемые эксперты!
1. Напишите программу, которая выводит все перестановки целых чисел из N элементов.
3
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
2. При печати документа можно выбрать страницы, которые будут отправлены на принтер. Пусть заданы номера страниц в порядке возрастания. Напишите программу, которая перечисляет номера страниц через запятую, при этом страницы, идущие подряд, замените на диапазон, указывая первую и последнюю страницу через дефис.
Входные данные: 1 3 4 5 6 11 12 15
Выходные данные: 1, 1-6, 11-12, 15
Прошу исправить ошибки.

Приложение:
2.

Var
n, i, j: Integer;
x: Array[0..100] Of Integer;
flag: Boolean;
Procedure ReadData;
var s,s1,s2:string;
Begin
for i:=0 to 100 do x[i]:=0;
n:=0;
readln(s);
s1:='';
for i:=1 to length(s) do
begin
s2:=s[i];
if (s2>='0') and (s2<='9') then
s1:=s1+s2
else
if s1<>'' then
begin
n:=n+1;
val(s1,x[n],j);
s1:='';
end;
end;
if s1<>'' then
begin
n:=n+1;
val(s1,x[n],j);
s1:='';
end;
end;
Begin
ReadData;
flag := FALSE;
For i := 1 To n Do
Begin
If ((x[i+1] - x[i] <> 1) And (Not(flag))) Then
Begin
If (i <> n) Then
Begin
Write(x[i], ', ');
End;
If (i = n) Then
Begin
Write(x[i]);
End;
End;
If ((x[i+1] - x[i] = 1) And (Not(flag))) Then
Begin
Write(x[i], '-');
flag := TRUE;
End;
If ((x[i+1] - x[i] <> 1) And (flag)) Then
Begin
If (i <> n) Then
Begin
Write(x[i], ', ');
End;
If (i = n) Then
Begin
Write(x[i]);
End;
flag := FALSE;
End;
End;
WriteLn;
ReadLn;
End.

Обсуждение

давно
Профессор
401888
1232
21.02.2009, 09:42
общий
это ответ
Здравствуйте, Хощенко Артём Владимирович!
Решение первой и второй задач в приложении.

Приложение:
{ генерация перестановок }
uses crt;
const n = 5; { количество элементов в перестановке}
var a:array[1..n] of integer;{массив элементов перестановки}
j:integer;{счетчик}
kol : longint;{количество перестановок}
procedure generate (l,r:integer;var k:longint);
{рекурсивная процедура генерации перестановок, входные параметры-границы перестановок, выходной-количество их}
var i,v:integer; {счетчик цикла и буфер при обмене}
begin
if (l=r) then {если дошли до конца}
begin
for i:=1 to n do write(a[i],' '); {выводим на экран очередную перестановку}
writeln;
k:=k+1;{считаем}
if k mod 20 = 0 then readln;{для удобства просмотра делаем задержки после каждых 20 перестановок}
end
else {если еще не дошли}
begin
for i := l to r do {от данного положения начала (L) до конца}
begin
v:=a[l]; a[l]:=a[i]; a[i]:=v; {обмен a[i],a[l]} {обмениваем текущий первый элемент с очередным}
generate(l+1,r,k); {вызов новой генерации}{увеличиваем на 1 начало перестановки}
v:=a[l]; a[l]:=a[i]; a[i]:=v; {обмен a[i],a[l]} {снова меняем}
end;
end;
end;
begin
clrscr;
for j := 1 to n do {заполняем первоначальный массив}
a[j]:=j;{или порядковыми номерами(обычно) или как Вам нравится}
generate( 1,n,kol); {генерация}
writeln('kol=',kol);{вывод количества}
readln
end.
{нумерация страниц
Чтобы не заморачиваться с Вашим навороченным кодом, сделал по своему. Использовал девиз скульпторов, сначала создаю неправильную строку, потом от нее отсекаю все лишнее.}
uses crt;
const nmax=100;
var a:array[1..nmax] of word;
s,c:string;
n,i,j,k:word;
begin
clrscr;
repeat
write('Vvedite kolichestvo stranic n=');
readln(n);
until (n>1)and(n<=nmax);
repeat
writeln('Vvedite ',n,' nomerov stranic po vozrastaniyu:');
for i:=1 to n do
read(a[i]);
readln;
k:=0;
for i:=2 to n do {проверяем правильность ввода}
if a[i]<=a[i-1] then
begin
k:=1;
break;
end;
if k=1 then writeln('Dopushena oshibka! Povtorite vvod.');
until k=0;
str(a[1],c); {преобразуем в строку первое число}
s:=c;{начальная строка}
i:=2;{начинаем со второго}
while i<=n do
begin
str(a[i],c);{преобразуем}
if a[i]-a[i-1]<>1 then s:=s+', '+c;{если не по порядку, запятая +число}
if (a[i]-a[i-1]=1)and(a[i+1]-a[i]<>1) then s:=s+'-'+c;{если по порядку, а следующее не по порядку, то дефис+число}
if (a[i]-a[i-1]=1)and(a[i+1]-a[i]=1) then {если 3 по порядку, то}
begin
s:=s+'-';{пишем дефис}
inc(i);{переходим к следующему}
end
else inc(i);{если не 3 попорядку, к следующему}
end;
for i:=length(s)downto 1 do {удаляем сочетания (,-)}
if (s[i]='-')and(s[i+1]=',') then
delete(s,i+1,2);
while pos('--',s)>0 do {удаляем лишние дефисы}
delete(s,pos('--',s),1);
write(s);
readln
end.
давно
Профессор
401888
1232
21.02.2009, 12:45
общий
Добавил решене второй задачи.
Неизвестный
23.02.2009, 13:24
общий
фух.... решение обалденное конечное. не додумался бы сам до такого. но ведь задача не та - с клавиатуры вводится число Н, а потом выводятся все перестановки целых чисел из Н элементов.
Неизвестный
23.02.2009, 13:28
общий
вторая программа тоже с ошибкой. кол-во страниц нам не известно. в моём коде нужно исправить процедуру считывания. считывать числа, пока они вводятся. как это сделать - моих знаний не хватает.
давно
Профессор
401888
1232
23.02.2009, 13:31
общий
Не понял. Сделал так как Вы привели в примере. Напишите подробнее и с хорошим, реальным примером. Если Вас смущат, что N-константа, то это легко поправить. Если нужны числа не попорядку, то введите в массив то, что нужно. Короче не понял, что нужно.
давно
Профессор
401888
1232
23.02.2009, 13:35
общий
Второй год ведем периодически с Вами переписку и одна и та же картина. Не умея точно сформулировать задачу, Вы потом высказываете кучу необоснованных претензий. Короче, решайте сами, так, как Вам нужно. Я пас.
Неизвестный
23.02.2009, 13:36
общий
хорошо. сейчас объясню понятнее. константы теперь не смущают, ограниченя по средствам, которые можно использовать, не вводилисьс клавиатуры вводится число Н. мы должны вывести все перестановки из натуральных чисел до Н. см. пример:
3
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
Неизвестный
23.02.2009, 13:52
общий
почему не умея сформулировать задачу? задачи даю те, которые даются мне. с примерами. я же их Вам пишу, а не просто так, наощупь. так что притензии, предъявленные ко мне, считаю необоснованными.
Неизвестный
23.02.2009, 13:55
общий
и ещё: ругаться с Вами не хочу, но не могу не удержаться указать Вам на ВАШУ ошибку: задачи написаны понятным языком и с примерами. так что смысл задачи вполне можно понять. и не надо мне высказывать, что я не умею сформулировать задачу.... не с головы же беру!
Форма ответа