Помощь - Поиск - Пользователи - Календарь
Полная версия: Тема: Массивы
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Dr. Ra
Дана задача:
Элементы заданого вектора циклически сдвинуть на К позиций влево.

Я программу-то написал, но так и не понял, что значит: сдвинуть циклически.
Можете обьяснить?
volvo
Цитата(Dr. Ra @ 12.04.05 18:39)
Я программу-то написал, но так и не понял, что значит: сдвинуть циклически.

Как же ты программу написал, если не понял, что означает циклический сдвиг?

Это, кстати, значит, что при сдвиге влево первый элемент массива становится последним...


Было: 123456
К = 2
Стало: 345612
Dr. Ra
Цитата(volvo @ 12.04.05 19:55)
Как же ты программу написал, если не понял, что означает циклический сдвиг?

Это, кстати, значит, что при сдвиге влево первый элемент массива становится последним...


Было: 123456
К = 2
Стало: 345612




АААА....понятно, а я решил что просто надо из каждого элемента вычесть К чисел.
Спасибо!
FreeMan
Код

asm
mov ax,chislo
ror ax,5 {циклический сдвиг вправо на 5 бит}
mov chislo,ax
end;
Dr. Ra
Цитата(FreeMan @ 12.04.05 20:17)
Код

asm
mov ax,chislo
ror ax,5 {циклический сдвиг вправо на 5 бит}
mov chislo,ax
end;



:no: Ничего не разобрал, а что такое mov и ror???
volvo
Dr. Ra, может Freeman и прав... Можно задание уточнить? Нужно сдвигать циклически сам массив, или его элементы?

Поясню на примере. Есть вектор <1, 2, 3, 4, 5> Можно сдвинуть весь вектор например на 2 позиции влево, и получим вектор <3, 4, 5, 1, 2>. А можно сдвинуть элементы вектора, и получим: <1 сдвинутая на К позиций влево, 2 сдвинутая на К позиций влево, и т.д.>

Что имеется в виду?
Dr. Ra
Цитата(volvo @ 12.04.05 22:51)
Что имеется в виду?


Необходимо, ЭЛЕМЕНТЫ заданого вектора циклически сдвинуть на К позиций влево.

Зы. Я попробывал через перестановку чисел в массиве, что-то не очень выходит...
Dr. Ra
Интересно, на меня, что все забили??? sad.gif
volvo
Ну так Freeman же дал правильное решение... Чем оно не устраивает?

Добавлено:
Не нравится ассемблер, тогда вот Паскаль:
function rol(x: word; const k: byte): word;
var
 i: byte;
begin
 for i := 1 to k do begin
   x := (x shl 1) or
     byte(((x and $8000) = $8000));
 end;
 rol := x
end;

const
 n = 10;
 k = 2;
 a: array[1 .. n] of word =
   (32000, 2, 3, 4, 5, 6, 7, 8, 9, 10);

var
 i, T: integer;
begin
 for i := 1 to n do begin
   a[i] := rol(a[i], k);
   write(a[i]:4);
 end;
 writeln;
end.
Dr. Ra
Цитата(volvo @ 13.04.05 22:43)
Не нравится ассемблер, тогда вот Паскаль:


Спасибо, конечно, smile.gif но вот проблемма - мы еще не прошли процедур и ф-й.
Если я сдам задачку в таком виде, препод заподозрит меня в халтуре и то , что задачку не я делал. smile.gif

Можно ли сделать эту задачу без применения процедур???
volvo
Цитата(Dr. Ra @ 14.04.05 18:58)
Можно ли сделать эту задачу без применения процедур???

:yes: Легко...
const
 n = 10;
 k = 2;
 a: array[1 .. n] of word =
   (32000, 2, 3, 4, 5, 6, 7, 8, 9, 10);

var
 i, j: integer;
begin
 for i := 1 to n do begin
   for j := 1 to k do begin
     a[i] := (a[i] shl 1) or
       byte(((a[i] and $8000) = $8000));
   end;
   write(a[i]:4);
 end;
 writeln;
end.
-Павел-
Цитата(volvo @ 12.04.2005 18:55) *

Как же ты программу написал, если не понял, что означает циклический сдвиг?

Это, кстати, значит, что при сдвиге влево первый элемент массива становится последним...


Было: 123456
К = 2
Стало: 345612


А вы не могли бы представить код программы, которая как раз и выполняет сие действо, т.е. 12345->сдвиг при k=2->34512. K должно быть переменным числом. Неделю бьюсь уже, с двумя массивами придумал, всё работает, но препод говорит, что нужно с одним.
volvo
size - размер массива A ...
for i := 1 to K do begin { <--- Проделываем K раз }

T := A[1]; { <--- Запоминаем первый элемент }
for j := 1 to size - 1 do A[j] := A[j+1]; { <--- Сдвигаем все элементы кроме первого на один влево }
A[size] := T; { <--- Устанавливаем бывший первый на последнюю позицию }

end;
-Павел-
Цитата(volvo @ 27.11.2006 17:25) *

size - размер массива A ...
for i := 1 to K do begin { <--- Проделываем K раз }

T := A[1]; { <--- Запоминаем первый элемент }
for j := 1 to size - 1 do A[j] := A[j+1]; { <--- Сдвигаем все элементы кроме первого на один влево }
A[size] := T; { <--- Устанавливаем бывший первый на последнюю позицию }

end;


Ну что я могу сказать... Мастер, честное слово... good.gif Спасибо большое!
Гость
У меня похожая задача. Над сдвинуть циклически вправо. Может кто поможет ? Заранее спасибо.
volvo
T := a[size];
for j := size downto 2 do A[j] := A[j - 1];
a[1] := T;

вместо того, что было...
Гость
пасиб! все работает.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.