Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [Pascal] Сдвиг массива на r-эленентов.


Автор: InviZible 26.1.2007, 14:32
Необходимо сдвинуть массив на r элементов.
Не могу понять, как вернуться к 1 элементу
Код

program sdvig;
uses crt;
const
 n=5;
 r=2;
var
 a,b:array[1..n] of integer;
 i,j,k:integer;
begin
 clrscr;
 writeln('Vvedi n =',n);
 for i:=1 to n do
  read(a[i]);
 readln;
 writeln('===massiv====');
 for i:=1 to n do
  write(a[i],' ');
 writeln;

 i:=1;
 while (i<=n) do begin
  if ((i+r)<=n) then b[i]:=a[i+r];
  if ((i+r)>n) then b[i]:=a[];           {Что-то тут надо сделать наверно.}
  inc(i);
 end;

 writeln('===new massiv====');
 for i:=1 to n do
  write(b[i],' ');

 readln;
end.


Заранее спасибо.

Автор: Kuvaldis 26.1.2007, 14:43
InviZible
Посмотри ссылки внизу страницы smile 

Автор: InviZible 26.1.2007, 14:46
Смотрел.

Автор: Sunvas 26.1.2007, 14:47
InviZible, может так:
Код

b[i]:=a[(i+r) mod n];

Автор: InviZible 26.1.2007, 14:53
Цитата(Sunvas @  26.1.2007,  14:47 Найти цитируемый пост)
b[i]:=a[(i+r) mod т];

а что за "т"? если это i или r, то не так ((

Автор: Sunvas 26.1.2007, 14:58
Цитата(InviZible @  26.1.2007,  14:53 Найти цитируемый пост)
а что за "т"? если это i или r, то не так ((

Блин, ну обнови страницу!!

Автор: InviZible 26.1.2007, 15:03
Вау, работает, спасибо. Но как ты догадался? Я сколько не высчитывал на бумаге до такого не дошел(

Автор: Sunvas 26.1.2007, 15:05
Цитата(InviZible @  26.1.2007,  15:03 Найти цитируемый пост)
Вау, работает, спасибо. Но как ты догадался? Я сколько не высчитывал на бумаге до такого не дошел(

ЧМОР!

Автор: InviZible 26.1.2007, 15:07
ЧМОР!? Я таких слов не знаю)

Автор: Sunvas 26.1.2007, 16:05
Цитата(InviZible @  26.1.2007,  15:07 Найти цитируемый пост)
ЧМОР!? Я таких слов не знаю)

http://forum.vingrad.ru/act-Help/CODE-01/HID-17.html  smile 

Автор: InviZible 28.1.2007, 13:51
Некорректно работает с некоторыми значениями n и r. Например, при n=5 r=-2
n=5 r=5((

Автор: Sunvas 28.1.2007, 13:59
Попробуй всю эту хренотень:
Цитата(InviZible @  26.1.2007,  14:32 Найти цитируемый пост)
Код

  if ((i+r)<=n) then b[i]:=a[i+r];    
  if ((i+r)>n) then b[i]:=a[];    
 

заменить одной строчкой:

Цитата(Sunvas @  26.1.2007,  14:47 Найти цитируемый пост)
    
Код

b[i]:=a[(i+r) mod n];


Автор: volvo877 28.1.2007, 14:23
Цитата(InviZible @  28.1.2007,  12:51 Найти цитируемый пост)
Например, при n=5 r=-2

Вот так работает корректно...

Код

 i := 1;
 while (i <= n) do begin
   b[i] := a[succ(((pred(i) + byte(r <= 0) * n + (r mod n))) mod n)];
   inc(i);
 end;

Автор: InviZible 28.1.2007, 17:11
Sunvas и volvo877, большое спасибо.
Только я что-то не пойму, причем тут byte(r <= 0), вот этот момент не понятен.
Если не сложно, то скажите пару слов, пожалуйста.

Автор: Sunvas 28.1.2007, 17:55
Цитата(InviZible @  28.1.2007,  17:11 Найти цитируемый пост)
byte(r <= 0)

возвращает 1, если r<=0 и 0 если нет.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)