Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Помогите пожалуйста. Массив нужно свернуть в "кольцо".

Автор: Gothar 1.06.2009 0:07

Массив целых чисел х[1]... х[п] «свернуть в кольцо» и повернуть вправо на К позиций (К может быть больше п).

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

Автор: Krjuger 1.06.2009 0:15

Выложите то что смогли сделать,даже если не работает.Чтоб было видно,что вы пытались хотябы это решить.

Автор: Gothar 1.06.2009 0:19

Цитата(Krjuger @ 31.05.2009 21:15) *

Выложите то что смогли сделать,даже если не работает.Чтоб было видно,что вы пытались хотябы это решить.


Вот что попытался сделать. получается бред

program jopa;
uses crt;
type mas=array[1..1000] of integer;
var m:mas;k,tmp,i,n:integer;
begin
clrscr;
writeln('vvedi n');
readln(n);
writeln('vvedi ',n,' elementov massiva');
for i:=1 to n do
readln(m[i]);
writeln('vvedi kolichestvo pozicii sdviga');
readln(k);
for i:=1 to k do
begin
tmp:=n;
for i:=n downto k do
m[i]:=m[i-1];
m[1]:=tmp
end;
for i:=1 to n do
write(m[i]:3);
readln;
end.

Автор: Client 1.06.2009 0:48

Посмотри http://forum.pascal.net.ru/index.php?showtopic=23922&hl=move+%F1%E4%E2%E8%F8

Автор: Gothar 1.06.2009 1:08


Посмотрел! Всё равно правильно работать не хочет(( Видимо я вообще дурак полный(

Автор: sheka 1.06.2009 1:09

2 аll
что означает «свернуть в кольцо»?
для чего предназначена процедура Move(A[2], A[i], (size - 1)*Sizeof(integer)); и что за переменные в нее вводятся?

расскажите пожалуйста.

Автор: Gothar 1.06.2009 1:24

Цитата(sheka @ 31.05.2009 22:09) *

2 аll
что означает «свернуть в кольцо»?
для чего предназначена процедура Move(A[2], A[i], (size - 1)*Sizeof(integer)); и что за переменные в нее вводятся?

расскажите пожалуйста.


Вот что получается! Где косяк! Помогите понять ПОжалуйста!

program jopa;
uses crt;
type mas=array[1..1000] of integer;
var m:mas;k,tmp,i,n:integer;
begin
clrscr;
writeln('vvedi n');
readln(n);
writeln('vvedi ',n,' elementov massiva');
for i:=1 to n do
readln(m[i]);
writeln('vvedi kolichestvo pozicii sdviga');
readln(k);
for i:=1 to k do
begin
tmp:=n;
for i:=n downto k do
{m[i]:=m[i-1];}
Move(m[2], m[i], (n - 1)* n, of(integer))
m[1]:=tmp;
end;
for i:=1 to n do
write(m[i]:3);
readln;
end.

Автор: Krjuger 1.06.2009 1:58

Ну во первых ты в tmp присваиваеш n а потом первому элементу присваиваеш n,это уже косяк,тебе надо значение н-ого элемента....А во вторых тебе четко написали,как работает процедура movе,а ты что мудриш зачем какие то два цикла???плюс сдвинуть надо вправо,а ты влево двигаеш.И повторить эту операцию надо n-k раз.


for j:=1 to n-k do
begin
tmp:=m[n];
Move(m[1], m[i], (n + 1)* n, of(integer))
m[1]:=tmp;
end;



Автор: Gothar 1.06.2009 2:07

Цитата(Krjuger @ 31.05.2009 22:58) *

Ну во первых ты в tmp присваиваеш n а потом первому элементу присваиваеш n,это уже косяк,тебе надо значение н-ого элемента....А во вторых тебе четко написали,как работает процедура movе,а ты что мудриш зачем какие то два цикла???плюс сдвинуть надо вправо,а ты влево двигаеш.И повторить эту операцию надо n-k раз.

for j:=1 to n-k do
begin
tmp:=m[n];
Move(m[1], m[i], (n + 1)* n, of(integer))
m[1]:=tmp;
end;



mega_chok.gif косяк тут понял!!!!! Но проблема осталась!!!! При сдвиге на 1 он не сдвигает! При 2х на 1! и т.д.
Да и к тому же не читает сдвиги выше 5ти! тоесть условие задания (k может быть больше n) не выполняется! blink.gif

Автор: Client 1.06.2009 2:12

for k:=1 to n1 do begin //n1-это сколько сдвигов
j:=a[n];
for i:=n downto 2 do a[i]:=a[i-1];
a[1]:=j
end;

Автор: Gothar 1.06.2009 2:21

Цитата(Client @ 31.05.2009 23:12) *

for k:=1 to n1 do begin //n1-это сколько сдвигов
j:=a[n];
for i:=n downto 2 do a[i]:=a[i-1];
a[1]:=j
end;



Блин((( Я запутался!!!!!!
Тоесть надо вместо процедуры
for j:=1 to n-k do
begin
tmp:=m[n];
Move(m[2], m[i], (n - 1)* n);
m[1]:=tmp;
end;


Надо
for j:=1 to k do 
begin
tmp:=m[n];
for i:=n downto 2 do
m[i]:=m[i-1];
m[1]:=tmp;
end;


ТАК?

Автор: volvo 1.06.2009 2:23

Лучше - так:

// k = число сдвигов, n = размер массива
for i := 1 to k mod n do begin
tmp := m[n];
Move(m[1], m[2], (n-1)*sizeof(integer));
m[1]:=tmp;
end;

, чтоб не делать заведомо лишнее...

Автору: как ты думаешь, Правила тебя не касаются? Мало того, что тема названа не пойми как, еще и тегами не пользуешься... В следующий раз такая тема сразу улетит в мусорку.

А чтоб не улетела сейчас - исправляй...

Автор: Gothar 1.06.2009 2:28

Цитата(volvo @ 31.05.2009 23:23) *

Автору: как ты думаешь, Правила тебя не касаются? Мало того, что тема названа не пойми как, еще и тегами не пользуешься... В следующий раз такая тема сразу улетит в мусорку.
А чтоб не улетела сейчас - исправляй...


Исправил! Спасибо за предупреждение! Редко на форумах бываю просто

Автор: Client 1.06.2009 2:30

Цитата
Исправил!
Еще и название темы smile.gif

Автор: Gothar 1.06.2009 2:32

Цитата(volvo @ 31.05.2009 23:23) *

Лучше - так:
// k = число сдвигов, n = размер массива
for i := 1 to k mod n do begin
tmp := m[n];
Move(m[1], m[2], (n-1)*sizeof(integer));
m[1]:=tmp;
end;

, чтоб не делать заведомо лишнее...

Автору: как ты думаешь, Правила тебя не касаются? Мало того, что тема названа не пойми как, еще и тегами не пользуешься... В следующий раз такая тема сразу улетит в мусорку.

А чтоб не улетела сейчас - исправляй...


Впринципе сдвигает нормально. с одним но! k не может быть больше n!!!!! виснет! Как быть?

Добавлено через 2 мин.
Цитата(Client @ 31.05.2009 23:30) *

Еще и название темы smile.gif


А как? mega_chok.gif

Автор: volvo 1.06.2009 2:36

Цитата
А как?
Редактировать первое сообщение...

Цитата
k не может быть больше n!!!!! виснет!
Неправда, проверял на k = 8, n = 5, работает прекрасно...

Автор: Krjuger 1.06.2009 2:37

А что есть сдвиг на К при К больше N??По сути это сдвиг на разность К и N,просто делаеш условие,если к меньше N оставляеш то что было,если больше то чуть чуть изменяеш и вуаля...

Вольво а у меня вопрос о приотитете действий.

Цитата

for i := 1 to k mod n do begin

если к меньше n,то получается мы сдвигаем на остаток дробной части чтоли?И или не нужны ли скобки при к mod n или они чисто формальны в данном случае(?

Автор: Gothar 1.06.2009 2:41

Цитата(volvo @ 31.05.2009 23:36) *

Редактировать первое сообщение...

Неправда, проверял на k = 8, n = 5, работает прекрасно...



Всё! Нашел косяк! Спасибо Огромное! smile.gif

Автор: volvo 1.06.2009 2:41

Krjuger в первую очередь, а с ним и все остальные: ВНИМАТЕЛЬНО смотрим на ответы, которые появляются в теме: там MOD не для красоты, между прочим... Я надеюсь, объяснять, как работает MOD не надо? Какие, блин, условия еще придумали? Запустите компилятор уже, и проверьте, а не ДОГАДЫВАЙТЕСЬ...

Добавлено через 2 мин.

Цитата
не нужны ли скобки при к mod n
Нет, скобки не нужны, приоритет ни при чем. Приоритет важен, когда в выражении больше одной операции, а здесь она всего одна...

Автор: Gothar 1.06.2009 2:45

Название темы изменено!)
Вот итоговый код программы:

program jopa;
uses crt;
type mas=array[1..1000] of integer;
var m:mas;k,tmp,i,n,n1:integer;
begin
clrscr;
writeln('vvedi n');
readln(n);
writeln('vvedi ',n,' elementov massiva');
for i:=1 to n do
readln(m[i]);
writeln('vvedi kolichestvo pozicii sdviga');
readln(k);
for i := 1 to k mod n do
begin
tmp := m[n];
Move(m[1], m[2], (n-1)*sizeof(integer));
m[1]:=tmp;
end;
for i:=1 to n do
write(m[i]:3);
readln;
end.


Всем спасибо огромное! good.gif